Avatar billede leif Seniormester
14. september 2008 - 21:09 Der 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

Kan en hjælpe mig på vej hvad jeg gør galt ?

/Leif
Avatar billede jakobdo Ekspert
14. september 2008 - 21:13 #1
test lige denne:

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'
Avatar billede leif Seniormester
14. september 2008 - 21:43 #2
Så får jeg 2 som jeg skal, men så mangler jeg blot data fra demo_medlemmer
Avatar billede HenrikSjang Nybegynder
14. september 2008 - 21:44 #3
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".
Avatar billede jakobdo Ekspert
14. september 2008 - 21:45 #4
Der kunne du lave endnu en INNER JOIN mod din 3. tabel så.
Du må netop have et eller andet som binder dem sammen også.
Avatar billede HenrikSjang Nybegynder
14. september 2008 - 21:47 #5
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'
Avatar billede leif Seniormester
14. september 2008 - 21:48 #6
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'

Ser det rigtigt ud
Avatar billede leif Seniormester
14. september 2008 - 21:49 #7
Er det så korrekt at lave en GROUP BY demo_medlemmer.id hvis jeg kun vil have et givent medlem 1 gang ?
Avatar billede jakobdo Ekspert
14. september 2008 - 21:52 #8
Virker denne ikke da:

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'

???
Avatar billede leif Seniormester
14. september 2008 - 21:56 #9
Jo, den virker fint, men jeg så lige et andet problem, hvis jeg tilføjer:
id | medlemid | typeid
6 | 19 | 36

til demo_tilmeldt_medlemstype

Så kommer medlemid 19 ud 2 gange og det "må" den ikke.
Avatar billede jakobdo Ekspert
14. september 2008 - 22:01 #10
Nu har jeg ikke styr på din tabeller, så det ved jeg ikke.
Men din SQL burde kun give dig info om det medlem med bruger ID = 5
Avatar billede leif Seniormester
14. september 2008 - 22:04 #11
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)
Avatar billede jakobdo Ekspert
14. september 2008 - 22:12 #12
Men hvis din bruger har flere adgange, så vil der jo netop komme flere rækker.
Avatar billede leif Seniormester
14. september 2008 - 22:14 #13
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
Avatar billede jakobdo Ekspert
15. september 2008 - 07:58 #14
Det er det jo ikke.
For hvis brugeren har medlemstype 33 og 36, så er det jo korrekt du får 2 rækker som resultat.
Avatar billede leif Seniormester
10. juli 2009 - 12:34 #15
Jeg kan ikke huske hvad løsningen blev.... Men smid nogle svar for jeres tid.
Avatar billede jakobdo Ekspert
10. juli 2009 - 12:59 #16
Svar!
Avatar billede jakobdo Ekspert
10. juli 2009 - 13:32 #17
Takker for point.
Avatar billede leif Seniormester
10. juli 2009 - 13:37 #18
Så lidt
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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