2013-11-25 43 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

相关问题