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
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.
SELECT Users.user_id, Users.user_name, Groups.group_name
FROM Users LEFT OUTER JOIN
Groupmembers ON Users.user_id = Groupmembers.groupmember_user_id LEFT OUTER JOIN
Groups ON Groupmembers.groupmember_group_id = Groups.group_id AND Groups.group_user_id = 1
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.
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.
SELECT
u.user_name, g.group_name FROM users u, groups g, groupmembers gm
WHERE
gm.groupmember_group_id = g.group_id
AND
gm.groupmember_user_id = u.user_id
AND
g.group_user_id = 1
SELECT
u.user_name, g.group_name FROM users u, groups g, groupmembers gm
@ 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
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
FROM users g
LEFT JOIN groups_members gm ON g.user_id = gm.user_id
RIGHT JOIN groups gr ON gr.group_id=gm.group_id
INNER JOIN users gc on gr.group_user_id = gc.user_id
WHERE gc.user_id=1 and g.user_id <> 1
ORDER BY gr.group_id
SELECT g.user_id AS UserID,g.user_name AS UserName,IF(gm.user_id ISNULL,0,1)AS PartOfGroup,gr.group_name AS GroupName
FROM users g
LEFTJOIN groups_members gm ON g.user_id = gm.user_id
RIGHTJOIN groups gr ON gr.group_id=gm.group_id
INNERJOIN users gc ON gr.group_user_id = gc.user_id
WHERE gc.user_id=1AND g.user_id <>1
ORDERBY gr.group_id
Als PartOfGroup = 0==> gebruiker is niet toegevoegd aan de group
SELECT Groups.group_id, Groups.group_name, Users.user_name
FROM Groups INNER JOIN
Groupmembers ON Groupmembers.groupmember_group_id = Groups.group_id INNER JOIN
Users ON Groupmembers.groupmember_user_id = Users.user_id
WHERE (Groups.group_user_id = 1)
Groupmembers ON Groupmembers.groupmember_group_id = Groups.group_id INNER JOIN
Users ON Groupmembers.groupmember_user_id = Users.user_id
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...
SELECT g.user_name, gm.groupmember_user_id, gr.group_name
FROM Users AS g LEFT OUTER JOIN
Groupmembers AS gm ON g.user_id = gm.groupmember_user_id RIGHT OUTER JOIN
Groups AS gr ON gr.group_id = gm.groupmember_group_id INNER JOIN
Users AS gc ON gr.group_user_id = gc.user_id
WHERE (gc.user_id = 1)
ORDER BY gr.group_id
SELECT g.user_id AS UserID, g.user_name AS UserName, gr.group_name AS GroupName
FROM Users AS g LEFT OUTER JOIN
Groupmembers AS gm ON g.user_id = gm.groupmember_user_id RIGHT OUTER JOIN
Groups AS gr ON gr.group_id = gm.groupmember_group_id INNER JOIN
Users AS gc ON gr.group_user_id = gc.user_id
WHERE (gc.user_id = 1) AND (g.user_id <> 1)
ORDER BY gr.group_id
SELECT g.user_id AS UserID, g.user_name AS UserName, gr.group_name AS GroupName
SELECT Users.user_id, Users.user_name, Groups.group_name
FROM Users
LEFT OUTER JOIN Groupmembers ON Users.user_id = Groupmembers.user_id
LEFT OUTER JOIN Groups ON Groupmembers.group_id = Groups.group_id
WHERE Groups.group_user_id =1
SELECT Users.user_id, Users.user_name, Groups.group_name
FROM Users LEFT OUTER JOIN
Groupmembers ON Users.user_id = Groupmembers.groupmember_user_id LEFT OUTER JOIN
Groups ON Groupmembers.groupmember_group_id = Groups.group_id
WHERE (Groups.group_user_id = 1)
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
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.
SELECT
u.user_name, g.group_name FROM users u, groups g, groupmembers gm
WHERE
gm.groupmember_group_id = g.group_id(+)
AND
gm.groupmember_user_id(+) = u.user_id
AND
g.group_user_id = 1
SELECT
u.user_name, g.group_name FROM users u, groups g, groupmembers gm
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
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.
SELECT u.user_name, g.group_name, g.group_user_id
FROM groups g
RIGHT JOIN groupmembers gm ON ( gm.groupmember_group_id = g.group_id )
RIGHT JOIN users u ON ( u.user_id = gm.groupmember_user_id )