2016-04-15 6 views
1

Ich habe eine Gruppe von Benutzern und Gruppen. Benutzer können Teil einer oder mehrerer Gruppen sein, und Gruppen können einen oder mehrere Benutzer haben. Also habe ich die Join-Tabelle von user_groups.Erstellen einer Zuordnung von Benutzern zu Gruppen und Abrufen der Gruppe basierend auf Benutzerkombinationen

Gibt es eine Möglichkeit, den Namen der Gruppe herauszufinden, basierend auf einer genauen Kombination von Benutzern? Ich bin nicht positiv, wenn die Struktur, die ich dafür habe korrekt ausgeführt werden würde, dies, aber hier sind zwei Beispiele:

Der Benutzer mit ID 1 (Jeff) ist Teil von zwei Gruppen, wie durch die user_groups Tabelle. Für die eine Gruppe mit der ID 2 ist er das einzige Mitglied. Und für die andere Gruppe von ID 4 ist er einer von zwei Mitgliedern.

Ich möchte in der Lage sein, eine Abfrage zu erstellen, wo, wenn ich nur seine ID habe, ich weiß, dass der Gruppenname GP-B ist, denn das ist die Zuordnung. Wenn ich die Benutzer-IDs 1 und 4 habe, wird dies der Gruppe 4 zugeordnet, also würde ich wissen, dass der Gruppenname GP-D ist.

SELECT id, name FROM users;

1, Jeff 
2, John 
3, Mary 
4, Jen 
5, Mike 

SELECT id, name FROM groups;

1, GP-A 
2, GP-B 
3, GP-C 
4, GP-D 

SELECT user_id, group_id FROM user_groups;

1, 2 
1, 4 
2, 3 
4, 1 
4, 4 

Die beste Abfrage, die ich bisher mit so kommen könnte, ist:

SELECT groups.name 
FROM user_groups 
LEFT JOIN groups 
    ON groups.id = user_groups.group_id 
WHERE user_id IN (1,4) 
GROUP BY group_id 
HAVING COUNT(*) = 2; 

Und das schien zu funktionieren. Allerdings, wenn ich nur die einzelnen Benutzer tat:

SELECT groups.name 
FROM user_groups 
LEFT JOIN groups 
    ON groups.id = user_groups.group_id 
WHERE user_id IN (1) 
GROUP BY group_id 
HAVING COUNT(*) = 1; 

Es endet beide Gruppen zieht er ein Teil ist von, so etwas ist nicht richtig über meine Frage.

+2

Nicht die Antwort, aber hier ist eine SQL-Geige. http://sqlfiddle.com/#!9/58596/1 – Jeroen

Antwort

1

Sie müssen nur den WHERE Ausdruck bewegen - user_id IN (1) - in der JOIN-Bedingung:

SELECT groups.name 
FROM user_groups 
LEFT JOIN groups 
    ON groups.id = user_groups.group_id AND user_id IN (1) 
GROUP BY group_id 
HAVING COUNT(*) = 1 AND groups.name IS NOT NULL; 

(und einen Filter in der HAVING-Klausel festgelegt, so dass Sie NULL Gruppen ausschließen - diejenigen, die nicht übereinstimm)

auf diese Weise können alle Zeilen von user_groups und dann werden Sie in der Lage sein, um sicherzustellen, erhalten wird, dass die Zählung, die genaue Anzahl der Datensätze erhalten, die Sie eingegeben.

In Ihrer anfänglichen Abfrage filtert die Klausel WHERE einige Zeilen heraus, sodass Sie nicht wirklich korrekt zählen können, wie viele Mitglieder in jeder Gruppe enthalten sind (weil Sie diejenigen ausschließen, die nicht mit Ihrem Filter übereinstimmen).

+0

Sie sind ein Assistent. Ja, genau das habe ich gesucht. Vielen Dank! – kenshin9

Verwandte Themen