(My) SQL JOIN – Holen Sie sich Teams mit genau spezifizierten Mitgliedern

Übernehmen Sie Tabellen

team: id, title team_user: id_team, id_user 

Ich würde gerne Teams mit nur bestimmten Mitgliedern auswählen. In diesem Beispiel möchte ich Team (s), wo die einzigen Benutzer diejenigen mit ID 1 und 5 sind, niemand sonst. Ich habe dieses SQL entwickelt, aber es scheint für diese einfache Aufgabe etwas übertrieben zu sein.

 SELECT team.*, COUNT(`team_user`.id_user) AS cnt FROM `team` JOIN `team_user` user0 ON `user0`.id_team = `team`.id AND `user0`.id_user = 1 JOIN `team_user` user1 ON `user1`.id_team = `team`.id AND `user1`.id_user = 5 JOIN `team_user` ON `team_user`.id_team = `team`.id GROUP BY `team`.id HAVING cnt = 2 

EDIT: Vielen Dank für Ihre Hilfe. Wenn Sie Ihre Ideen tatsächlich ausprobieren möchten, können Sie Beispieldatenbankstruktur und -daten verwenden, die Sie hier finden: http://down.lipe.cz/team_members.sql

Solutions Collecting From Web of "(My) SQL JOIN – Holen Sie sich Teams mit genau spezifizierten Mitgliedern"

Wie wäre es mit

 SELECT * FROM team t JOIN team_user tu ON (tu.id_team = t.id) GROUP BY t.id HAVING (SUM(tu.id_user IN (1,5)) = 2) AND (SUM(tu.id_user NOT IN (1,5)) = 0) 

Ich gehe von einem eindeutigen Index für team_user (id_team, id_user) aus.

Sie können verwenden

 SELECT DISTINCT id, COUNT(tu.id_user) as cnt FROM team t JOIN team_user tu ON ( tu.id_team = t.id ) GROUP BY t.id HAVING count(tu.user_id) = count( CASE WHEN tu.user_id = 1 or tu.user_id = 5 THEN 1 ELSE 0 END ) AND cnt = 2 

Nicht sicher, warum Sie die Bedingung cnt = 2 benötigen, die Abfrage würde nur diejenigen Teams erhalten, in denen alle Benutzer die ID 1 or 5

Versuche dies

 SELECT team.*, COUNT(`team_user`.id_user) AS cnt FROM `team` JOIN `team_user` ON `team_user`.id_team = `team`.id where `team_user`.id_user IN (1,5) GROUP BY `team`.id HAVING cnt = 2