You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从含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;

逻辑解释:

  1. 先用WHERE status IN ('A', 'B', 'C')过滤掉无关的状态记录,缩小查询范围
  2. 按id分组,把同一个ID的所有状态记录归为一组
  3. 用COUNT(DISTINCT status)统计每组里不同状态的数量,只有数量等于3的组(也就是同时拥有A、B、C三种状态)才会被筛选出来
  4. 加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';

逻辑解释:

  1. 把同一张表分别当作三个临时表t1、t2、t3
  2. 通过JOIN关联条件,分别筛选出拥有A、B、C状态的ID,最终取三者的交集
  3. 加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:54:59