如何编写SQL分组查询,确保组内所有person_id在指定查询结果中
筛选所有成员均符合条件的分组ID
需求说明
我们需要从你的第二张分组表(假设表名为person_groups,请替换为实际表名)中,找出所有**分组内的person_id全部属于“仅拥有1个订单的用户”**的ID。其中,“仅拥有1个订单的用户”可通过以下查询获取:
SELECT person_id FROM orders GROUP BY person_id HAVING COUNT(order_id) = 1
两种直接实现方式
方式1:反向排除不符合的分组
通过NOT EXISTS判断分组中是否存在不符合条件的person_id,不存在则保留该分组:
SELECT DISTINCT pg.ID FROM person_groups pg WHERE NOT EXISTS ( SELECT 1 FROM person_groups pg_inner WHERE pg_inner.ID = pg.ID AND pg_inner.person_id NOT IN ( SELECT person_id FROM orders GROUP BY person_id HAVING COUNT(order_id) = 1 ) )
方式2:正向验证匹配数量
统计每个分组内符合条件的person_id数量,若等于分组总人数,则说明该分组所有成员都符合要求:
SELECT pg.ID FROM person_groups pg LEFT JOIN ( -- 先获取符合条件的person_id列表 SELECT person_id FROM orders GROUP BY person_id HAVING COUNT(order_id) = 1 ) qualified ON pg.person_id = qualified.person_id GROUP BY pg.ID HAVING COUNT(pg.person_id) = COUNT(qualified.person_id)
逻辑解释
- 方式1的核心是排除法:只要分组里有一个person_id不在目标列表中,就剔除这个分组,剩下的就是全部符合要求的分组。
- 方式2的核心是数量匹配:分组总人数等于符合条件的人数,意味着没有成员被排除,即所有人都符合要求。
内容的提问来源于stack exchange,提问作者minxyen
相关产品推荐
相关产品推荐

