SQL查找仅包含指定2个用户的团队

时间:2015-01-17 14:46:41

标签: mysql sql

我有一个名为team_members的表,其结构和内容如下:

+---------+---------+
| team_id | user_id |
+---------+---------+
|       1 |      18 |
+---------+---------+
|       1 |       7 |
+---------+---------+
|       3 |      18 |
+---------+---------+

我想要做的是找到一个只包含2个用户的团队,这个用户由我提供(在这种情况下,用户身份为id 7和18)。不幸的是,我对如何正确地进行此查询没有任何想法。我尝试过像

这样的东西
SELECT a.team_uid
FROM team_members a
INNER JOIN (
    SELECT team_uid, user_id, COUNT(*) cnt_team
    FROM team_members
    GROUP BY team_uid
    HAVING COUNT(*) = 2
) b ON a.user_id = b.user_id

3 个答案:

答案 0 :(得分:1)

要考虑的事情(假设在team_id,user_id上有PK)......

SELECT x.*, COUNT(*),SUM(user_id IN(7,18)) FROM my_table x GROUP BY team_id;

答案 1 :(得分:1)

还有其他几种方法($id1$id2是有问题的用户):

SELECT team_id
  FROM team_members
 GROUP BY team_id
HAVING COUNT(*) = 2
   AND MIN(user_id) = LEAST($id1,$id2)
   AND MAX(user_id) = GREATEST($id1,$id2)

See SQL Fiddle Demo here$id1$id2的值为7和18。我正在使用LEAST()GREATEST(),以防不知道哪个更高,哪个更低(例如,如果它们来自用户输入)。

SELECT team_id
  FROM team_members
 GROUP BY team_id
HAVING GROUP_CONCAT(user_id ORDER BY user_id) = ('7,18')

See SQL Fiddle Demo here。同样,如果不知道哪个更高,哪个更低,则可以写为(ORDER BY中的GROUP_CONCAT()是不必要的):

SELECT team_id
  FROM team_members
 GROUP BY team_id
HAVING GROUP_CONCAT(user_id) IN ('$id1,$id2','$id2,$id1')

答案 2 :(得分:0)

您也可以使用:

select team_id
  from team_members
 group by team_id
having sum(user_id not in(7, 18)) = 0

上面的示例假设您希望团队只有7或18个用户(没有其他用户,但不一定都是用户)。

如果您希望团队拥有4和18用户,而没有其他用户,则可以使用:

select team_id
  from team_members
 group by team_id
having sum(user_id not in(7, 18)) = 0
   and sum(user_id in(7, 18)) = 2