03. august 2007 - 07:48Der 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?)
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%'
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%'
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.
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
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.