/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
komplex sql
Fra : Tobber


Dato : 13-02-05 11:21

Jeg har fået det råd af Peter Brodersen at placere mit spørgsmål her i
stedet for i serverside.php, SÅ med en enkelt rettelse:

Jeg sveder over et problem. Jeg ønsker at lave en søgning i min mysql-DB til
min hjemmeside, men det jeg ønsker er meget indviklet - synes jeg.

jeg har 6 tabeller!
billeder
mapper
mappe_gruppe
grupper
gruppe_bruger
brugere

Dem behøver jeg kædet sammen således at jeg kun får de billeder at se hvor:
(1. brugeren har ret til det
OG
3. en søgetekst indgår i en beskrivelsen til billedet)
ELLER
(2. den mappe hvor billedet ligger i er 'åben' for alle
OG
3. en søgetekst indgår i en beskrivelsen til billedet)

Den første er opfyldt når og kun når:
brugere.bruger_ID = gruppe_bruger.bruger_ID
OG
gruppe_bruger.gruppe_ID = mappe_gruppe.gruppe_ID
OG
mappe_gruppe.mappe_ID = billeder.mappe_ID

Den anden betingelse er opfyldt med:
mapper.open = 'open' [enum]
OG
mapper.mappe_ID = billeder:mappe_ID

Den tredje er opfyldt med:
billeder.titel LIKE %streng%

Hvordan skal jeg skrive det samme til een request - eller er jeg tvunget til
at gøre noget af arbejdet med PHP. Jeg vil bare gerne kunne sortere i
resultatet. Jeg håber det er til at se hvad det er jeg ønsker.

Tobber





 
 
Troels Arvin (13-02-2005)
Kommentar
Fra : Troels Arvin


Dato : 13-02-05 16:41

On Sun, 13 Feb 2005 11:21:11 +0100, Tobber wrote:

> Jeg ønsker at lave en søgning i min mysql-DB

Et MySQL-DBMS er ikke bare et MySQL-DBMS: Der er verden til forskel på
MySQL før og efter version 4.1.x, i særdeleshed mht. om man kan bruge
underforespørgsler.

> Hvordan skal jeg skrive det samme til een request

Du må opbygge din forespørgsel lidt ad gangen. Her er det rigtig rart
have have mulighed for at benytte VIEWs, men det er der endnu ingen
produktionsklar MySQL-version, der har.

Anyways, lad os lige høre, hvilken MySQL-generation, du bruger.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Jens Gyldenkærne Cla~ (13-02-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-02-05 22:51

Tobber skrev:

> Den første er opfyldt når og kun når:
> brugere.bruger_ID = gruppe_bruger.bruger_ID
> OG
> gruppe_bruger.gruppe_ID = mappe_gruppe.gruppe_ID
> OG
> mappe_gruppe.mappe_ID = billeder.mappe_ID

Det kriterium bliver til en række joins:

SELECT billeder.*
FROM billeder
INNER JOIN mappe_gruppe
   ON mappe_gruppe.mappe_ID = billeder.mappe_ID
INNER JOIN gruppe_bruger
   ON gruppe_bruger.gruppe_ID = mappe_gruppe.gruppe_ID
INNER JOIN brugere
   ON brugere.bruger_ID = gruppe_bruger.bruger_ID



> Den anden betingelse er opfyldt med:
> mapper.open = 'open' [enum]

Den venter vi lige lidt med.

> OG
> mapper.mappe_ID = billeder:mappe_ID

- for her kommer endnu et join:

INNER JOIN mapper
   ON mapper.mappe_ID = billeder.mappe_ID

Nu har du 5 af dine seks tabeller i spil - og resten af kriterierne
er lige til at sætte i en WHERE-del:

WHERE mapper.open = 'open'

> Den tredje er opfyldt med:
> billeder.titel LIKE %streng%

AND billeder.titel LIKE %streng%


Sæt det hele sammen - så skulle du have en færdig forespørgsel.

NB: Jeg har brugt SELECT billeder.* i stedet for bare SELECT * for
kun at hente felter fra billedtabellen. Der er ingen grund til at
medtage flere felter i postsættet end dem du skal bruge i
udskriften.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter Brodersen (13-02-2005)
Kommentar
Fra : Peter Brodersen


Dato : 13-02-05 23:22

On Sun, 13 Feb 2005 22:51:07 +0100, Jens Gyldenkærne Clausen
<jens@gyros.invalid> wrote:

>Sæt det hele sammen - så skulle du have en færdig forespørgsel.

... men idet det ikke er et ufravigeligt krav, at det første kriterie
skal være opfyldt, så bør der vel LEFT JOIN'es i stedet for? Så kan
man altid begrænse rækkerne i WHERE-kriteriet på den ene side af et
større OR-udtryk (hvor den anden side af udtrykket omhandler åbne
mapper)

--
- Peter Brodersen

Tobber (14-02-2005)
Kommentar
Fra : Tobber


Dato : 14-02-05 09:54

Jeg havde selv lagt ud med LEFT JOINs. Det duede næsten! Men nu skal jeg
forsøge med jeres forslag og så vender jeg tilbage med relsultatet.
Takker

Tobber

"Peter Brodersen" <usenet2005@ter.dk> skrev i en meddelelse
news:cuojul$6uj$1@news.klen.dk...
> On Sun, 13 Feb 2005 22:51:07 +0100, Jens Gyldenkærne Clausen
> <jens@gyros.invalid> wrote:
>
>>Sæt det hele sammen - så skulle du have en færdig forespørgsel.
>
> .. men idet det ikke er et ufravigeligt krav, at det første kriterie
> skal være opfyldt, så bør der vel LEFT JOIN'es i stedet for? Så kan
> man altid begrænse rækkerne i WHERE-kriteriet på den ene side af et
> større OR-udtryk (hvor den anden side af udtrykket omhandler åbne
> mapper)
>
> --
> - Peter Brodersen



Jens Gyldenkærne Cla~ (14-02-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 14-02-05 12:01

Peter Brodersen skrev:

> .. men idet det ikke er et ufravigeligt krav, at det første kriterie
> skal være opfyldt, så bør der vel LEFT JOIN'es i stedet for?

Ja, enten det eller også skal der laves en UNION-forespørgsel (jeg kan
dog ikke huske om MySQL understøtter det).

Jeg havde overset ELLER i beskrivelsen af forespørgslen.

I øvrigt tror jeg også der er en anden ting der ikke holder. Tobber
skriver at betingelse 1: Brugeren har ret til at se billedet er opfyldt
når:

brugere.bruger_ID = gruppe_bruger.bruger_ID
OG
gruppe_bruger.gruppe_ID = mappe_gruppe.gruppe_ID
OG
mappe_gruppe.mappe_ID = billeder.mappe_ID


- men ovenstående er jo et join på samtlige brugere (der har tilladelse
til at se billedet), og det er derfor uafhængigt af hvilken bruger der
aktuelt er logget ind.

Jeg vil gætte på at kriterierne for at betingelse 1 er opfyldt i stedet
skal være:

gruppe_bruger.bruger_ID = [aktuelt brugerID]
OG
gruppe_bruger.gruppe_ID = mappe_gruppe.gruppe_ID
OG
mappe_gruppe.mappe_ID = billeder.mappe_ID

Hvis det er rigtigt, behøver vi slet ikke have brugertabellen i spil i
forespørgslen:

SELECT DISTINCT billeder.*
FROM billeder
INNER JOIN mapper
   ON mapper.mappe_ID = billeder.mappe_ID
LEFT JOIN mappe_gruppe
   ON mappe_gruppe.mappe_ID = billeder.mappe_ID
LEFT JOIN gruppe_bruger
   ON gruppe_bruger.gruppe_ID = mappe_gruppe.gruppe_ID
WHERE billeder.titel LIKE %streng%
AND (mapper.open = 'open' OR gruppe_bruger.bruger_ID = [brugerID])


--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Tobber (14-02-2005)
Kommentar
Fra : Tobber


Dato : 14-02-05 13:46

DET VIRKER!!!

Dit var rigtigt og så havde jeg glemt at ejerskab til en mappe også giver
adgang til billederne i de, dvs. reaultatet er blevet:

SELECT DISTINCT billeder.*
FROM billeder
INNER JOIN mapper
ON mapper.mappe_ID = billeder.mappe_ID
LEFT JOIN mappe_gruppe
ON mappe_gruppe.mappe_ID = billeder.mappe_ID
LEFT JOIN bruger_gruppe
ON bruger_gruppe.gruppe_ID = mappe_gruppe.gruppe_ID
WHERE
billeder.titel LIKE %streng%
AND
(bruger_gruppe.bruger_ID = [bruger_ID]
OR
mapper.open = 'open'
OR
mapper.user_ID = [bruger_ID])
ORDER BY
billeder.titel


Tusinde smil :)


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:sttoczirfg1a$.dlg@jcdmfdk.invalid...
> Peter Brodersen skrev:
>
>> .. men idet det ikke er et ufravigeligt krav, at det første kriterie
>> skal være opfyldt, så bør der vel LEFT JOIN'es i stedet for?
>
> Ja, enten det eller også skal der laves en UNION-forespørgsel (jeg kan
> dog ikke huske om MySQL understøtter det).
>
> Jeg havde overset ELLER i beskrivelsen af forespørgslen.
>
> I øvrigt tror jeg også der er en anden ting der ikke holder. Tobber
> skriver at betingelse 1: Brugeren har ret til at se billedet er opfyldt
> når:
>
> brugere.bruger_ID = gruppe_bruger.bruger_ID
> OG
> gruppe_bruger.gruppe_ID = mappe_gruppe.gruppe_ID
> OG
> mappe_gruppe.mappe_ID = billeder.mappe_ID
>
>
> - men ovenstående er jo et join på samtlige brugere (der har tilladelse
> til at se billedet), og det er derfor uafhængigt af hvilken bruger der
> aktuelt er logget ind.
>
> Jeg vil gætte på at kriterierne for at betingelse 1 er opfyldt i stedet
> skal være:
>
> gruppe_bruger.bruger_ID = [aktuelt brugerID]
> OG
> gruppe_bruger.gruppe_ID = mappe_gruppe.gruppe_ID
> OG
> mappe_gruppe.mappe_ID = billeder.mappe_ID
>
> Hvis det er rigtigt, behøver vi slet ikke have brugertabellen i spil i
> forespørgslen:
>
> SELECT DISTINCT billeder.*
> FROM billeder
> INNER JOIN mapper
> ON mapper.mappe_ID = billeder.mappe_ID
> LEFT JOIN mappe_gruppe
> ON mappe_gruppe.mappe_ID = billeder.mappe_ID
> LEFT JOIN gruppe_bruger
> ON gruppe_bruger.gruppe_ID = mappe_gruppe.gruppe_ID
> WHERE billeder.titel LIKE %streng%
> AND (mapper.open = 'open' OR gruppe_bruger.bruger_ID = [brugerID])
>
>
> --
> Jens Gyldenkærne Clausen
> Svar venligst under det du citerer, og citer kun det der er
> nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
> hvordan på http://usenet.dk/netikette/citatteknik.html



Jens Gyldenkærne Cla~ (14-02-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 14-02-05 15:34

Tobber skrev:

> DET VIRKER!!!

Tillykke. Hvis du vil gøre lidt til gengæld, må du gerne læse min
signatur.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste