2016-06-02 7 views
1

Nach drei SQL-Tabellen beschreiben, wer zu welcher Gruppe gehört. Zum Beispiel gehört Ann zur Gruppe A/B, Ben zur Gruppe B/C und Chris zur Gruppe A/C.MySQL: Suche Gruppe von konstituierenden Mitgliedern mit UND-Bedingung

Jetzt, wenn ich "eine Gruppe, die sowohl Ann UND Ben gehören" suchen möchten, wie sollten wir die SELECT-Abfrage schreiben? Oder sollten wir diese Tabellen anders gestalten?

(1) Benutzer


+-----------+------------------+ 
| member_id | member_name  | 
+-----------+------------------+ 
|   1 | Ann    | 
|   2 | Ben    | 
|   3 | Chris   | 
+-----------+------------------+ 

(2) Gruppen


+-----------+------------------+ 
| group_id | group_name  | 
+-----------+------------------+ 
|   1 | Group A   | 
|   2 | Group B   | 
|   3 | Group C   | 
+-----------+------------------+ 

(3) users_groups


+-----------+------------------+ 
| group_id | user_id   | 
+-----------+------------------+ 
|   1 |    1 | 
|   2 |    1 | 
|   2 |    2 | 
|   3 |    2 | 
|   1 |    3 | 
|   3 |    3 | 
+-----------+------------------+ 

Antwort

1
SELECT group_id, group_name 
FROM groups 
JOIN users_groups ON groups.group_id = users_groups.group_id 
JOIN users ON users_groups.user_id = users.member_id 
WHERE member_id = 1 
INTERSECT 
SELECT group_id, group_name 
FROM groups 
JOIN users_groups ON groups.group_id = users_groups.group_id 
JOIN users ON users_groups.user_id = users.member_id 
WHERE member_id = 2 

Dies wird die Gruppen-ID und die Namen aller geben Gruppen, in denen Ann und Ben sind. Fühlen Sie sich frei, das m zu ersetzen ember_id = # clause mit member_name = 'name', wenn Sie nach ihrem Namen anstatt nach ihrer ID suchen wollen.

EDIT: Ich habe vergessen, dass MySQL nicht INTERSECT hat. Das oben Gesagte funktioniert also für die meisten DBMS, aber das Folgende sollte die gewünschten Ergebnisse für MySQL liefern.

SELECT groups.group_id, groups.group_name 
FROM groups 
JOIN users_groups ON groups.group_id = users_groups.group_id 
JOIN users ON users_groups.user_id = users.member_id 
WHERE member_id = 1 
AND groups.group_id IN (SELECT groups.group_id 
         FROM groups 
         JOIN users_groups ON groups.group_id = users_groups.group_id 
         JOIN users ON users_groups.user_id = users.member_id 
         WHERE member_id = 2) 
+0

Vielen Dank für Ihre Antwort, aber es scheint, dass wir nicht "Schnittpunkt" in MySQL verwenden können. Weißt du wie das geht? – eng27

+0

Oh, richtig. Ich habe vergessen, dass MySQL ist .. Seltsam, wie DBMS gehen. Ich bearbeite meine Antwort mit einer Problemumgehung. –

+0

Vielen Dank für die alternative Lösung – eng27