2013-11-25 48 views
1

假設表(我的)SQL JOIN - 獲得與準確指定成員的團隊

team: id, title 
team_user: id_team, id_user 

我想選擇與公正,只有指定的會員隊伍。在這個例子中,我希望團隊中唯一的用戶是ID爲1和5的用戶,而不是其他用戶。我想出了這個SQL,但對於這麼簡單的任務似乎有點矯枉過正。

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 

編輯:謝謝大家的幫助。如果你想真正地嘗試一下你的想法,你可以使用例如數據庫結構和數據在這裏找到:http://down.lipe.cz/team_members.sql

回答

3

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) 

我假設team_user(id_team,id_user)上的唯一索引。

+0

空結果集:/ – sKopheK

+0

糟糕,應該有已經是SUM,而不是COUNT。我糾正了我的輸入。順便說一句,你的數據不包含id_user 5.這是一個SQLFiddle,查詢1,3:http://sqlfiddle.com/#!2/19d5e/20 –

+0

希望不提供不必要的數據。你的解決方案似乎適用於我。 – sKopheK

0

嘗試這個

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 
+0

where子句做他的工作,只有1.5個記錄。從結果中篩選出6個。 –

+0

這也將顯示一個團隊成員:'(1,5,6,8)' –

+0

是@ypercube你是對的。 –

1

您可以使用

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 

不知道爲什麼你會需要cnt = 2條件,查詢將只得到那些所有用戶ID或者1 or 5

+0

刪除'DISTINCT',不需要。 –

+0

結果集在案例條件中不依賴用戶ID - 當替換爲其他任何內容時,無論您輸入多少用戶ID,它都會得到相同結果,僅取決於cnt參數 – sKopheK

相關問題