假设我有以下交叉表MemberClub:
MemberID | ClubId
1 | 2
2 | 1
2 | 2
2 | 3
我希望得到ID为和 2的俱乐部中的所有成员。所以结果应该是ID为2的成员。
我的where语句怎么样?我尝试了不同的变化,但我不确定选择哪一种。
预期输出应为:
MemberID | ClubId
2 | 1
2 | 2
我需要一个灵活的版本,适用于灵活数量的俱乐部(可能是我希望所有成员都在俱乐部中只有ID 1.或者所有成员都在俱乐部,ID为2,和 6)。
答案 0 :(得分:1)
具有GROUP BY
解决方案的常规HAVING COUNT(DISTINCT)
:
select MemberID
from MemberClub
WHERE ClubId IN (1,2)
GROUP BY MemberID
HAVING COUNT(DISTINCT ClubId) = 2
即。确保用户有两个不同的ClubId
。
或者,确保用户有不同的ClubId
(仅适用于两个俱乐部案例):
select MemberID
from MemberClub
WHERE ClubId IN (1,2)
GROUP BY MemberID
HAVING max(ClubId) <> min(ClubId)
或者跳过GROUP BY
,改为自我JOIN
:
select distinct m1.MemberID
from MemberClub m1
join MemberClub m2 on m1.MemberID = m2.MemberID
where m1.ClubId = 1
and m2.ClubId = 2
返回所有俱乐部的成员:
select MemberID
from MemberClub
GROUP BY MemberID
HAVING COUNT(DISTINCT ClubId) = (select count(distinct ClubId) from MemberClub)