如何从含id与status列的表中筛选出拥有全部A/B/C状态的id?
找出同时拥有三种状态的ID
嘿,这个需求在日常数据库查询里挺常见的,我给你分享两种实用的解决方案,都能精准定位到同时包含A、B、C三种状态的ID,结合你的示例数据来给你讲清楚👇
方法一:GROUP BY + HAVING(最简洁高效)
这是最常用的写法,逻辑清晰且性能不错:
SELECT id FROM your_table_name WHERE status IN ('A', 'B', 'C') GROUP BY id HAVING COUNT(DISTINCT status) = 3;
逻辑解释:
- 先用
WHERE status IN ('A', 'B', 'C')过滤掉无关的状态记录,缩小查询范围 - 按
id分组,把同一个ID的所有状态记录归为一组 - 用
COUNT(DISTINCT status)统计每组里不同状态的数量,只有数量等于3的组(也就是同时拥有A、B、C三种状态)才会被筛选出来 - 加
DISTINCT是为了避免同一个ID下有重复的同状态记录(比如你的示例里ID1有两条A)干扰统计结果,让逻辑更严谨
方法二:自连接查询(适合复杂场景扩展)
如果后续需要更复杂的条件判断,自连接的方式会更灵活:
SELECT DISTINCT t1.id FROM your_table_name t1 JOIN your_table_name t2 ON t1.id = t2.id AND t2.status = 'B' JOIN your_table_name t3 ON t1.id = t3.id AND t3.status = 'C' WHERE t1.status = 'A';
逻辑解释:
- 把同一张表分别当作三个临时表
t1、t2、t3 - 通过
JOIN关联条件,分别筛选出拥有A、B、C状态的ID,最终取三者的交集 - 加
DISTINCT是为了避免同一个ID被多次返回
示例数据验证
用你给出的示例数据:
id status
1 A
2 A
1 B
3 A
3 B
3 C
运行上面任意一段SQL,都会返回id=3,这正是我们要找的同时拥有三种状态的ID。
注意事项:
- 记得把代码里的
your_table_name替换成你实际使用的表名 - 如果
status字段可能存在NULL值,建议在WHERE条件里加上status IS NOT NULL,避免影响统计结果 - 如果你的业务场景里状态值可能增加,方法一只需要修改
IN里的列表和COUNT的目标数值,扩展性更强
内容的提问来源于stack exchange,提问作者Tohidul Islam Foysal
相关产品推荐
相关产品推荐

