2016-07-31 22 views
0

Ich habe 2 Tabellen Ein Benutzer 1-Gruppe eine Gruppe zugeordnet ist, kannMysql LEFT JOIN (1 Beziehung)

Tabelle ein 6 Benutzer (ID, Name, GroupID) mehr als 1 haben Mit Ausnahme 1, werden alle Benutzer einer Gruppe Tabelle B 4 Gruppen (ID, Groupname) zugeordnet

ich möchte alle Gruppen-Liste und der Benutzer in jeder Gruppe auch wenn kein Benutzer

SELECT groups.Group_ID, groups.Group_name, 
     Group_concat(users.User_ID order by User_ID) AS assigned 
FROM groups 
LEFT JOIN users 
    ON groups.Group_ID = users.GroupID 
GROUP BY groups.Group_ID 

Dieser zugeordnet ist gibt nur die Auflistung von grou zurück ps.

+0

Sie SELECT Benutzer hinzufügen *, ... in Sie –

+0

abfragen Warum LEFT JOIN und nicht FULL Outter JOIN.? –

+0

@OmidCompSCI Wenn Sie fragen müssen, nun, MySQL ist möglicherweise nicht der richtige Thread für Sie. – Strawberry

Antwort

0

Ich bin ziemlich sicher, dass Ihr Problem ist, dass Sie Listen speichern, wenn Gruppen-IDs in einer einzigen Spalte. Sie sollten Ihre Datenstruktur reparieren und eine UserGroups Tabelle mit einer Zeile pro Benutzer und einer pro Gruppe haben.

Manchmal stecken wir fest mit den schlechten Designentscheidungen anderer Leute. In diesem Fall können Sie find_in_set() verwenden:

On find_in_set(g.groupid, u.groupids) > 0 
0

Wenn Sie in Ihrer Ergebnismenge nichts als NULL-Werte in Ihrer assigned-Spalte erhalten, ist dies ein Beweis dafür, dass Ihre ON groups.Group_ID = users.GroupID-Bedingung niemals erfüllt wird.

Sie sollten wahrscheinlich den Inhalt Ihrer Tabellen überprüfen, um festzustellen, ob die ID-Spalten, die Sie in dieser ON-Bedingung verwenden, so funktionieren, wie Sie denken.

Beachten Sie auch, dass Sie eine nonstandard MySQL extension to GROUP BY verwenden. Dies kann manchmal zu Verwirrung führen. Versuchen Sie GROUP BY groups.Group_ID, groups.Group_name und sehen Sie, ob sich Ihre Ergebnisse verbessern.

0
SELECT groups.Group_ID, groups.Group_name, group_concat(users.User_ID order by user_ID) AS assigned FROM groups, users where groups.Group_ID = users.User_ID OR groups.Group_ID not in ((select users.User_ID from users)) GROUP BY groups.Group_ID, groups.Group_name; 

| GroupId | GroupName | assigned | 
+---------+-----------+-----------+ 
|  1 | a   | 1   | 
|  2 | b   | 2,3,4,5 | 
|  3 | c   | 1,2,3,4,5 | 

Wenn der Gruppe ‚a‘ zugeordnet ist, nur Benutzer 1, Gruppe ‚b‘ alle anderen Benutzer zugeordnet ist, und kein Benutzer gehört die ‚c‘ Gruppe dann, was Sie brauchen diese

kennen zu tun
|  3 | c   | null | 

anstelle des

|  3 | c   | 1,2,3,4,5 | 

?