14. september 2008 - 21:09Der er
17 kommentarer og 1 løsning
Problem med JOIN
Hej,
Hvad er der galt med denne SQL sætning: SELECT * FROM demo_medlemmer,demo_tilmeldt_medlemstype INNER JOIN demo_bruger_medlemstype ON demo_bruger_medlemstype.typeid=demo_tilmeldt_medlemstype.typeid WHERE demo_bruger_medlemstype.brugerid = '5'
Jeg burde kun få 2 ud af da jeg i demo_tilmeldt_medlemstype kun har 2 poster samt 2 poster i demo_bruger_medlemstype, der ligger følgende data i tabellerne: demo_bruger_medlemstype: id | brugerid | typeid 1 | 5 | 33 2 | 5 | 36
id | medlemid | typeid 5 | 4 | 36 4 | 19 | 33
Men jeg får 12 poster og det samme medlem flere gange
SELECT * FROM demo_tilmeldt_medlemstype INNER JOIN demo_bruger_medlemstype ON demo_bruger_medlemstype.typeid=demo_tilmeldt_medlemstype.typeid WHERE demo_bruger_medlemstype.brugerid = '5'
ved at skrive "..from demo_medlemmer,demo_tilmeldt_medlemstype" laver du faktisk en join på disse tabeller, men du laver ikke en tilhørende where-klausul, der fortæller hvilke felter der skal joines på. Dermed laves en cross join, og det giver dit problem. Enten fjern "demo_medlemmer" fra din select, eller sørg for at tilføje noget i stil med dette: "where demo_medlemmer.Id = demo_tilmeldt_medlemstype.AndetID".
Du skriver ikke noget om hvilke felter der findes i din demo_medlemmer, men under antagelse af at der er et id-felt, som svarer til medlemid, så prøv med dette:
SELECT * FROM demo_tilmeldt_medlemstype INNER JOIN demo_bruger_medlemstype ON demo_bruger_medlemstype.typeid = demo_tilmeldt_medlemstype.typeid INNER JOIN demo_medlemmer ON demo_medlemmer.id = demo_bruger_medlemstype.medlemid WHERE demo_bruger_medlemstype.brugerid = '5'
SELECT * FROM demo_tilmeldt_medlemstype INNER JOIN demo_bruger_medlemstype ON demo_bruger_medlemstype.typeid=demo_tilmeldt_medlemstype.typeid INNER JOIN demo_medlemmer ON demo_medlemmer.id = demo_tilmeldt_medlemstype.medlemid WHERE demo_bruger_medlemstype.brugerid = '5'
SELECT * FROM demo_tilmeldt_medlemstype INNER JOIN demo_bruger_medlemstype ON demo_bruger_medlemstype.typeid=demo_tilmeldt_medlemstype.typeid INNER JOIN demo_medlemmer ON demo_medlemmer.id = demo_tilmeldt_medlemstype.medlemid WHERE demo_bruger_medlemstype.brugerid = '5'
demo_bruger_medlemstype = Indeholder hvad medlemstyper som brugeren har adgang til demo_tilmeldt_medlemstype = Indeholder hvilke medlemstyper som et medlem (fra demo_medlemmer) har tilknyttet, 1 Medlem kan sagtens have flere medlemstyper demo_medlemmer = Indeholder medlemmer (de kan ikke logge ind)
Brugeren har fx. adgang til medlemstype (typeid) 33 og 36 som medlemmet tilfældigvis begge er medlem af, men det kan jo løses med en GROUP BY demo_medlemmer.id, men kan ikke gennemskue om det er den rigtige måde
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.