SQL补全:筛选恰好含指定2个联系人且总成员数为2的分组
解决方案
你原SQL的问题出在WHERE阶段提前过滤了contact_id不是1、3的记录,导致统计不到分组的真实总人数,没法做总人数=2的校验。这里用条件聚合一次跑完两个校验规则就行,不需要多表关联,性能更好:
SELECT `group_id` FROM `TaskTeam_member` GROUP BY `group_id` HAVING -- 校验同时包含联系人1、3 COUNT(DISTINCT CASE WHEN contact_id IN (1,3) THEN contact_id END) = 2 -- 校验分组总成员数恰好为2 AND COUNT(DISTINCT contact_id) = 2
逻辑解释
- 去掉原SQL里的WHERE过滤条件,分组统计时能覆盖组内所有成员,拿到真实总人数
- 用CASE表达式单独统计组内属于1、3的联系人去重数量,等于2就说明两个联系人都在组里
- 两个条件同时满足才会返回,执行后只会得到你要的group_id=2的结果
如果你更习惯子查询的写法,也可以用下面的等价版本,只是性能比上面的写法差一点,数据量小的时候没有区别:
SELECT t.group_id FROM ( -- 原逻辑:筛选同时包含1、3的分组 SELECT group_id ,COUNT(DISTINCT contact_id) AS variants FROM TaskTeam_member WHERE contact_id IN (1,3) GROUP BY group_id HAVING variants=2 ) t INNER JOIN ( -- 统计每个分组的总成员数 SELECT group_id, COUNT(DISTINCT contact_id) AS total_cnt FROM TaskTeam_member GROUP BY group_id ) t2 ON t.group_id = t2.group_id WHERE t2.total_cnt = 2
注意:如果业务上保证同一个contact_id不会在同一个group_id下重复存储,COUNT里的DISTINCT可以去掉,能进一步提升查询速度。
内容的提问来源于stack exchange,提问作者Sad_Clown
相关产品推荐
相关产品推荐

