我有一个名为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
答案 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