28. marts 2006 - 23:10Der er
8 kommentarer og 1 løsning
To tabeller, vis alle tupler i den ene + info fra den anden
Uha, mit SQL er lidt rustent...
Jeg har to tabeller: "personer" og "anmeldelser". En række personer laver altså anmeldelser, dvs. der for hver anmeldelse er en fremmednøgle, der peger på primærnøglen i tabellen med personer.
"personer" har følgende attributer: _id_ navn password
"anmeldelser" har følgende attributer: _id_ person (fremmednøgle til "personer" tabellen) tekst karakter
Nu har jeg så følgende problemstilling: Jeg vil gerne lave forespørgsel, der returnerer samtlige tupler i person-tabellen, men hvor der er et par ekstra kollonner med, der fortæller noget om tabellen med anmeldelser. Fx hvor mange anmeldelser hver person har skrevet og den gennemsnitlige karakter, hver person har givet i sine anmeldelser.
Det er sikkert forholdsvist simpelt, men jeg må nok erkende, at det er for længe siden, jeg blev undervist i SQL, for jeg kan ikke lige komme på, hvordan jeg skal opbygge forespørgslen. Så vidt, jeg kan se, kan det ikke klares med en forespørgsel a la: "SELECT *, SUM(et eller andet) FROM personer, anmeldelser, WHERE ..." (?).
Det vigtige er altså, at samtlige tupler i person-tabellen kommer med, hvad enten personen har skrevet 0 eller flere anmeldelser. På forhånd tak.
michael_stim: Ikke hvis man fortsætter den med "WHERE personer.id = anmeldelser.person" for så bliver en person jo kun listet, hvis der er findes mindst én anmeldelse, der er skrevet af den pågældende person. Og den går ikke; en person skal listes, også selvom der ikke er en tilhørende tupel i "anmeldelser"-tabellen.
michael_stim: Ja, så giver det jo naturligvis bare foreningsmængden af alle tupler i "personer" med alle tupler i "anmeldelser". Det giver vist sig selv, at det ikke rigtig kan bruges...
Joins, ja. Man kan opbygge det med en LEFT JOIN. Jeg fik det ønskede resultat med følgende forespørgsel:
SELECT personer.*, COUNT(anmeldelser.id), AVG(anmeldelser.karakter) FROM personer LEFT JOIN anmeldelser ON personer.id = anmeldelser.person GROUP BY personer.id ORDER BY personer.navn;
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.