login  Naam:   Wachtwoord: 
Registreer je!
 Forum

SQL: Combineer 3 tabellen met JOINS (Opgelost)

Offline Mad_Mike - 05/06/2008 15:01 (laatste wijziging 05/06/2008 15:01)
Avatar van Mad_MikePHP beginner Ik zit met de volgende situatie:

Ik heb een talel (Users) waarin allemaal gebruikers zitten. Deze gebruikers kunnen zelf (ieder voor zich) groepen aanmaken (tabel Groups). Daarna kunnen ze de overige gebruikers in de doo hun zelf gemaakte groepen in delen.

Tabellen:

Users
user_id
user_name

data
1,Demo1
2,Demo2
3,Demo3
4,Demo4
5,Demo5
6,Demo5

Groups
group_id
group_user_id (Users.user_id who owns this group)
group_name

data
1,1,Design
2,1,Support
3,1,Sales
4,2,tmp_demo2

Groupmembers
groupmember_group_id (Groups.group_id)
groupmember_user_id (Users.user_id)

data
1,2
3,2
1,4

Ik wil een overzicht kunnen genereren voor bij voorbeeld user_id #1. Dus wil een lijst met alle gebruikers (uit Users tabel) en de daarbij behorende groups, die door user_id #1 is aangemaakt.

Gebruik daarvoor de volgende query
  1. SELECT Users.user_id, Users.user_name, Groups.group_name
  2. FROM Users LEFT OUTER JOIN
  3. Groupmembers ON Users.user_id = Groupmembers.groupmember_user_id LEFT OUTER JOIN
  4. Groups ON Groupmembers.groupmember_group_id = Groups.group_id AND Groups.group_user_id = 1


Met dit als resultaat:
  1. 1 demo1 Design
  2. 1 demo1 NULL
  3. 2 demo2 NULL
  4. 3 demo3 Support
  5. 4 demo4 NULL
  6. 5 demo5 NULL
  7. 6 demo6 NULL


Waarom krijg ik 2x user_id #1 te zien? Het heeft waarschijnlijk ermee te maken dat user_id #1 in twee verschillende groepen zit, maar wel van 2 verschillende gebruikers.

Iemand die mij hiermee kan helpen?

18 antwoorden

Gesponsorde links
Offline Wim - 05/06/2008 21:50
Avatar van Wim Crew algemeen GROUP BY user_id ;)

Verder zie ik dat je nogal veel NULL-waardes hebt. Als deze niet overeen komen met je db moet je eens een INNER join proberen ipv een LEFT OUTER join
Offline Mad_Mike - 06/06/2008 09:25 (laatste wijziging 06/06/2008 09:41)
Avatar van Mad_Mike PHP beginner @ Wimmarien
Zal het zometeen gaan proberen.

INNER Join zal niet het gewenste resultaat geven. Wil namelijk ALLE users met daarbij (als die gegevens er zijn) de naam van de groep waarin ze zitten voor een bepaalde gebruiker 

EDIT:
Wanneer ik achter aan de huidige query GROUP BY Users.user_id plaats krijg ik een foutmelding dat User.user_name en Groups.group_name (van de SELECT) niet meer bestaan in het resultaat.

Als ik deze (user_name en group_name) uit de SELECT haal en alleen een GROUP BY User.user_id doe krijg ik inderdaad wel het juiste resultaat, maar ik wil niet alleen user_id als resultaat... ook user_name en group_name

Als ik GROUP BY User.user_id, User.user_name, Groups.group_name doe krijg ik geen foutmelding, maar ook niet het gewenste resultaat. Krijg dan het 'oude' resultaat.

Enige idee?
Offline nemesiskoen - 06/06/2008 12:49
Avatar van nemesiskoen Gouden medaille

PHP expert
  1. SELECT
  2. u.user_name, g.group_name FROM users u, groups g, groupmembers gm
  3. WHERE
  4. gm.groupmember_group_id = g.group_id
  5. AND
  6. gm.groupmember_user_id = u.user_id
  7. AND
  8. g.group_user_id = 1
Offline Mad_Mike - 06/06/2008 13:02 (laatste wijziging 10/06/2008 09:11)
Avatar van Mad_Mike PHP beginner @ Vage
Zo krijg ik inderdaad een overzicht van de gebruikers incl de groepnaam, maar niet van de gebruikers waar deze gebruiker nog geen groep aan heeft gehangen.

krijg dus:
1 demo1 Design
3 demo3 Support

en wil:
1 demo1 Design
2 demo2
3 demo3 Support
4 demo4
5 demo5
6 demo6

EDIT:
Iemand??
Offline Berten - 10/06/2008 10:01 (laatste wijziging 10/06/2008 10:37)
Avatar van Berten PHP beginner
  1. SELECT g.user_id AS UserID,g.user_name AS UserName,IF(gm.user_id IS NULL,0,1) AS PartOfGroup,gr.group_name AS GroupName
  2. FROM users g
  3. LEFT JOIN groups_members gm ON g.user_id = gm.user_id
  4. RIGHT JOIN groups gr ON gr.group_id=gm.group_id
  5. INNER JOIN users gc ON gr.group_user_id = gc.user_id
  6. WHERE gc.user_id=1 AND g.user_id <> 1
  7. ORDER BY gr.group_id


Als PartOfGroup = 0==> gebruiker is niet toegevoegd aan de group
Offline Mad_Mike - 10/06/2008 10:14 (laatste wijziging 10/06/2008 10:51)
Avatar van Mad_Mike PHP beginner
Berten schreef:
[..code..]

(heb hier atm geen toegang om snel de query te testen, maar me dunkt dat 't zo moet werken)

Gebruik nu deze query (enkel (spel) foutjes eruit gehaald):
  1. SELECT Groups.group_id, Groups.group_name, Users.user_name
  2. FROM Groups INNER JOIN
  3. Groupmembers ON Groupmembers.groupmember_group_id = Groups.group_id INNER JOIN
  4. Users ON Groupmembers.groupmember_user_id = Users.user_id
  5. WHERE (Groups.group_user_id = 1)


Resultaat:
1 Design demo1
2 Support demo3

Ik krijg dus nu de gebruikersnaam + groepnaam van de gebruikers die user_id #1 in eigen groepen heeft ingedeeld, maar wil ook de overige gebruikers in het resultaat...

Bedankt voor het mee denken!

EDIT:
Net jou nieuwe Query getest:
  1. SELECT g.user_name, gm.groupmember_user_id, gr.group_name
  2. FROM Users AS g LEFT OUTER JOIN
  3. Groupmembers AS gm ON g.user_id = gm.groupmember_user_id RIGHT OUTER JOIN
  4. Groups AS gr ON gr.group_id = gm.groupmember_group_id INNER JOIN
  5. Users AS gc ON gr.group_user_id = gc.user_id
  6. WHERE (gc.user_id = 1)
  7. ORDER BY gr.group_id


Resultaat:
demo1 1 Design
demo3 3 Support
NULL NULL Sales

Helaas 

Het klopt idd dat ik NULL als Group.group_name wil krijgen wanneer die gebruiker niet in een groep zit!



NEW EDIT @ 10.50:
nieuwe query geeft foutmelding bij IF(....)
Zonder deze if (en de spelfouten erui tgehaalt) krijg je dus deze query:
  1. SELECT g.user_id AS UserID, g.user_name AS UserName, gr.group_name AS GroupName
  2. FROM Users AS g LEFT OUTER JOIN
  3. Groupmembers AS gm ON g.user_id = gm.groupmember_user_id RIGHT OUTER JOIN
  4. Groups AS gr ON gr.group_id = gm.groupmember_group_id INNER JOIN
  5. Users AS gc ON gr.group_user_id = gc.user_id
  6. WHERE (gc.user_id = 1) AND (g.user_id <> 1)
  7. ORDER BY gr.group_id


Resultaat:
3 demo3 Support
Offline Berten - 10/06/2008 10:47 (laatste wijziging 10/06/2008 10:48)
Avatar van Berten PHP beginner Ik krijg hier toch echt wel al de gebruikers die er bestaan. Of wil je dat elke gebruiker maar in 1 group kan voorkomen?
Offline Mad_Mike - 10/06/2008 10:53
Avatar van Mad_Mike PHP beginner - Iedere gebruiker kan zelf groepen aanmaken
- Iedere gebruiker kan een user maar in 1 eigen groep koppelen

Uiteindelijk zitten de gebruikers wel in meerdere groepen, maar die groepen zijn ook door verschillende gebruikers aan gemaakt...
Offline Berten - 10/06/2008 11:11 (laatste wijziging 10/06/2008 11:15)
Avatar van Berten PHP beginner btw: gebruik je mysql of iets anders?
  1. SELECT Users.user_id, Users.user_name, Groups.group_name
  2. FROM Users
  3. LEFT OUTER JOIN Groupmembers ON Users.user_id = Groupmembers.user_id
  4. LEFT OUTER JOIN Groups ON Groupmembers.group_id = Groups.group_id
  5. WHERE Groups.group_user_id =1
Offline Mad_Mike - 10/06/2008 11:16 (laatste wijziging 10/06/2008 11:17)
Avatar van Mad_Mike PHP beginner Database: MS Sql
GUI: Microsoft SQL Server Management Studio Express

  1. SELECT Users.user_id, Users.user_name, Groups.group_name
  2. FROM Users LEFT OUTER JOIN
  3. Groupmembers ON Users.user_id = Groupmembers.groupmember_user_id LEFT OUTER JOIN
  4. Groups ON Groupmembers.groupmember_group_id = Groups.group_id
  5. WHERE (Groups.group_user_id = 1)


1 demo1 Design
3 demo3 Support
Offline Berten - 10/06/2008 11:35
Avatar van Berten PHP beginner Ik kom er ook niet uit.

Misschien kunnen we't anders oplossen? We kunnen namenlijk wel 2 dingen doen.
1. Alle users weergeven die in een door user x aangemaakte groep zitten.
2. Alle users weergeven die niet in een door user x aangemaakte groep zitten.

Kan je het zo niet oplossen in je code (niet SQL) om de benodigde functionaliteit te bekomen
Offline Mad_Mike - 10/06/2008 11:38
Avatar van Mad_Mike PHP beginner Ik kom er ook niet uit... helaas.

Denk dat ik het als volgt ga oplossen. Eerst een query waar ik alle user_id's ophaal. En vervolgens per user_id kijken of deze in een group zit die door user_id #x is aangemaakt.
Offline nemesiskoen - 10/06/2008 12:46
Avatar van nemesiskoen Gouden medaille

PHP expert
Ik weet niet of deze syntax werkt in mysql/mssql, maar zo zou het er in oracle uitzien (als ik het goed begrijp)

  1. SELECT
  2. u.user_name, g.group_name FROM users u, groups g, groupmembers gm
  3. WHERE
  4. gm.groupmember_group_id = g.group_id(+)
  5. AND
  6. gm.groupmember_user_id(+) = u.user_id
  7. AND
  8. g.group_user_id = 1

dat zijn 2 left joins.
Offline Mad_Mike - 10/06/2008 12:51
Avatar van Mad_Mike PHP beginner In MS Sql krijg ik een error bij de (+) Zonder die erin krijg ik het volgende resultaat:

demo1 Design
demo3 Support

Dit is het overzicht van de gebruikers die user_id #1 in zijn eigen groepen heeft geplaatst. Echter wil ik in het resultaat ook de gebruikers die door user_id #1 niet in een groep geplaatst zijn. group_name is dan NULL
Offline nemesiskoen - 10/06/2008 17:39 (laatste wijziging 10/06/2008 17:57)
Avatar van nemesiskoen Gouden medaille

PHP expert
euh
dus: alle gebruikers die in een groep zitten die door user1 zijn aangemaakt + alle andere gebruikers maar dan met "null" als groepnaam?
Offline Mad_Mike - 10/06/2008 20:01
Avatar van Mad_Mike PHP beginner
vage schreef:
euh
dus: alle gebruikers die in een groep zitten die door user1 zijn aangemaakt + alle andere gebruikers maar dan met "null" als groepnaam?
True

Ik heb het nu met 2 queries opgelost:
- Query die alle gebruikers ophaalt (alleen de gebruikers)
- Query die per gebruiker (in de while van query 1) kijkt of deze in een groep van user_id #1 zit, zoja, naam van groep toekennen anders leeg/geen naam

Liefst zou ik willen weten of en hoe dit in 1 query kan.
Offline nemesiskoen - 10/06/2008 21:06 (laatste wijziging 10/06/2008 21:06)
Avatar van nemesiskoen Gouden medaille

PHP expert
  1. SELECT u.user_name, g.group_name, g.group_user_id
  2. FROM groups g
  3. RIGHT JOIN groupmembers gm ON ( gm.groupmember_group_id = g.group_id )
  4. RIGHT JOIN users u ON ( u.user_id = gm.groupmember_user_id )

en dan met php kijken of die group_user_id wel degelijk 1 is of niet:-)
Offline Mad_Mike - 11/06/2008 09:01
Avatar van Mad_Mike PHP beginner Ja dat kan idd, had alleen gehoopt dat het allemaal in 1 query zou kunnen.

Heb inmiddels het opgelost dmv een query in een query. Zo kan ik ook de query dynamisch uitbouwen dmv zoektermen.

Allen bedankt voor het meedenken!!
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.283s