Avatar billede konder Nybegynder
03. august 2007 - 07:48 Der er 6 kommentarer og
1 løsning

udtræk fra 3-tabeller

Sidder og roder lidt med tabeller.
Jeg har 3 tabeller: beboer, rapport og loft. Og et søgefelt der virker ok. ($result=mysql_query($sql="SELECT * FROM beboer WHERE adr LIKE '%$var%'") or die(mysql_error());)

Men jeg ville gerne have hægtet oplysninger fra rapport og loft på også. Og har så forsøgt med noget a.la.
($result=mysql_query($sql="SELECT * FROM (beboer LEFT JOIN rapport ON beboer.adr = rapport.adr)JOIN loft ON beboer.adr = loft.adr AND WHERE adr LIKE '%$var%'"); )  Hvilket altså ikke virker. (Måske fordi det samtidig er et søgefelt?)

Feltet adr er ens i alle 3 tabeller.
Avatar billede kjulius Novice
03. august 2007 - 18:30 #1
Du skriver:

SELECT * FROM (beboer LEFT JOIN rapport ON beboer.adr = rapport.adr)JOIN loft ON beboer.adr = loft.adr AND WHERE adr LIKE '%$var%'

Du kan for det første ikke have en AND WHERE på dit ON kriterie. Mon ikke det AND skal væk? Eller også skal WHERE væk. Du er også nødt til at angive hvilken tabel adr skal tages fra i dit kriterie.

Hvis det ikke er nok, så prøv med:

SELECT *
FROM beboer
INNER JOIN loft ON beboer.adr = loft.adr
OUTER LEFT JOIN rapport ON beboer.adr = rapport.adr
WHERE beboer.adr LIKE '%$svar%'
Avatar billede perkoch Nybegynder
04. august 2007 - 08:04 #2
Hvis du vil have alle beboere der matcher din adressesøgning uagtet, hvorvidt der findes data i tabellerne loft og rapport, vil jeg foreslå:
SELECT *
FROM beboer
LEFT JOIN loft ON beboer.adr = loft.adr
LEFT JOIN rapport ON beboer.adr = rapport.adr
WHERE beboer.adr LIKE '%$var%'
Avatar billede kjulius Novice
04. august 2007 - 09:59 #3
Det har du ret i. Jeg tog bare udgangspunkt i den forespørgsel, konder angav i spørgsmålet, og her var der angivet en inner join til loft.
Avatar billede konder Nybegynder
04. august 2007 - 10:30 #4
Mange tak, jeg forstår blot ikke at jeg ikke kan definere felterne. F.eks. virker dether:
while($res = mysql_fetch_array($result)){
echo "<td width=15% valign=top>" . $res["navn"] . "</td>";}
Men hvis jeg skriver: . $res["beboer.navn"] .  kommer der intet ud.
Avatar billede kjulius Novice
05. august 2007 - 05:26 #5
Nej, men det er fordi det feltnavn der returneres til dit applikationssprog (som i dit tilfælde ser ud til at være PHP) er det ukvalificerede navn. Grunden til at du skal angive det kvalificeret i SQL sætningen er, at denne ellers ikke kan vide fra hvilken tabel den skal tage det. Hvis der ikke er tvivl om, hvilken tabel feltet kommer fra (altså at feltet kun findes i én af de brugte tabeller), er det heller ikke nødvendigt at kvalificere navnet i forespørgslen. I dit tilfælde findes feltet adr åbenbart i alle tre brugte tabeller. Derfor er det nødvendigt at angive hvilken tabel det brugte feltnavn skal tages fra. Men som sagt: over for applikationen vises kun selve feltnavnet uden angivelse af tabel. Det er derfor også nødvendigt at "omdøbe" evt. "dobbeltgængere" (altså felter, som optræder flere gange i SELECT delen fra forskellige tabeller). Hvis du f.eks. havde lyst til at medtage dit adr felt fra alle tre tabeller i SELECT'en ville du være nødt til at angive et nyt navn for "dobbeltgængerne":

SELECT beboer.adr, loft.adr AS loft_adr, rapport.adr AS rapp_adr

I dit applikationsprogram ville du nu kunne referere til alle tre felter fordi de nu har tre forskellige navne: adr, loft_adr og rapp_adr

Jeg håber det har klaret begreberne lidt...
Avatar billede konder Nybegynder
06. august 2007 - 07:08 #6
meget godt forklaret. Jeg tror faktisk jeg forstår det!. I må begge gerne lægge et svar.
Avatar billede kjulius Novice
06. august 2007 - 08:41 #7
Hvad kan man ønske sig mere... *G*
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester