MySQL:如何查询排除含ADD值的ID_2分组对应的所有行?
解决MySQL分组筛选问题:找出不含特定值的分组所有行
先明确你的数据场景和需求:
原始数据表的结构与数据如下:
ID ID_2 Var1 1 L-1 ADD 2 L-1 DER 3 L-2 ADD 4 L-2 DER 5 L-3 DER 5 L-4 DER
你的核心需求是:仅获取那些ID_2分组下完全不存在Var1值为ADD的所有行,最终要得到L-3和L-4这两个分组的全部记录。
下面给你两种实用的实现方案:
方法一:子查询排除法
思路非常直接:先找出所有包含Var1='ADD'的ID_2分组,再在主查询里排除这些分组的记录。
SELECT t.* FROM your_table t WHERE t.ID_2 NOT IN ( SELECT DISTINCT ID_2 FROM your_table WHERE Var1 = 'ADD' );
逻辑拆解:
- 子查询
SELECT DISTINCT ID_2 FROM your_table WHERE Var1 = 'ADD'会得到所有存在ADD的分组(也就是L-1和L-2) - 主查询通过
NOT IN排除这些分组,剩下的就是完全没有ADD的分组的所有行
方法二:分组聚合关联法
通过分组统计每个ID_2下ADD的出现次数,筛选出次数为0的分组,再关联原表获取对应行:
SELECT t.* FROM your_table t JOIN ( SELECT ID_2 FROM your_table GROUP BY ID_2 HAVING SUM(CASE WHEN Var1 = 'ADD' THEN 1 ELSE 0 END) = 0 ) AS valid_groups ON t.ID_2 = valid_groups.ID_2;
逻辑拆解:
- 子查询里,
SUM(CASE WHEN Var1 = 'ADD' THEN 1 ELSE 0 END)会统计每个ID_2分组中ADD的出现次数 HAVING子句筛选出次数为0的分组(即完全没有ADD的分组)- 最后通过
JOIN关联原表,拿到这些分组的所有记录
执行任意一种方法后,都会得到你期望的结果:
ID ID_2 Var1 5 L-3 DER 5 L-4 DER
内容的提问来源于stack exchange,提问作者Vector JX
相关产品推荐
相关产品推荐

