Avatar billede lauritsen Nybegynder
28. marts 2006 - 23:10 Der 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.
Avatar billede michael_stim Ekspert
28. marts 2006 - 23:24 #1
"SELECT a.*, SUM(b.et eller andet) FROM personer a, anmeldelser b, WHERE ..." (?).
Er det sådan du mener?
Avatar billede lauritsen Nybegynder
29. marts 2006 - 00:02 #2
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.
Avatar billede michael_stim Ekspert
29. marts 2006 - 08:48 #3
og hvis du undlader where?
Avatar billede lauritsen Nybegynder
29. marts 2006 - 11:06 #4
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...
Avatar billede michael_stim Ekspert
29. marts 2006 - 11:15 #5
Så skal du jo ud i en subselect (hvis du bruger en nyere form af MySQL), eller en join.
Avatar billede michael_stim Ekspert
29. marts 2006 - 11:17 #6
SELECT a.*, (SELECT tekst FROM tabel b WHERE person=a.id) FROM tabel a
Avatar billede lauritsen Nybegynder
29. marts 2006 - 11:52 #7
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;

Smid et svar, hvis du vil have points'ne.
Avatar billede michael_stim Ekspert
29. marts 2006 - 11:54 #8
Du lavede den jo selv ;o) Så tag du bare dine point tilbage.
Avatar billede lauritsen Nybegynder
29. marts 2006 - 12:08 #9
Well, well...
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