如何编写MySQL查询:筛选未包含数值90的ID(排除含该值的ID)
解决MySQL查询未关联数值90的ID问题
我来帮你搞定这个需求!你要的是找出完全没有出现过数值90的ID,而不是那些仅部分记录不等于90的ID(比如ID1虽然有88,但它也关联了90,所以不能被包含在结果里)。下面是几种高效且准确的实现方法:
方法1:使用NOT EXISTS(推荐,逻辑直观且性能优异)
这种方法通过子查询检查每个ID是否存在关联90的记录,不存在则保留:
SELECT DISTINCT t.id FROM your_table t WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.id = t.id AND t2.value = 90 );
- 解释:
NOT EXISTS会针对每个ID,判断是否存在同ID且value=90的记录。如果不存在,就将该ID加入结果集。DISTINCT用来确保同一个ID只返回一次,避免重复。
方法2:使用GROUP BY + HAVING
通过分组统计每个ID的记录中是否包含90,筛选出完全没有90的ID:
SELECT id FROM your_table GROUP BY id HAVING SUM(CASE WHEN value = 90 THEN 1 ELSE 0 END) = 0;
或者更简洁的写法:
SELECT id FROM your_table GROUP BY id HAVING MAX(CASE WHEN value = 90 THEN 1 ELSE 0 END) = 0;
- 解释:分组后,用
CASE语句标记出每个记录是否为90,通过SUM或MAX统计该ID下是否存在90的记录。如果统计结果为0,说明这个ID完全没有关联90。
方法3:使用LEFT JOIN筛选NULL
通过左连接自身表,筛选出没有匹配到90记录的ID:
SELECT DISTINCT t.id FROM your_table t LEFT JOIN your_table t2 ON t.id = t2.id AND t2.value = 90 WHERE t2.id IS NULL;
- 解释:左连接会保留原表所有ID,当某个ID没有关联90的记录时,
t2.id会是NULL,通过这个条件就能筛选出目标ID。DISTINCT同样是为了去重。
为什么你的之前查询会出错?
如果之前你写的是类似WHERE value != 90的条件,那它只会过滤掉单条等于90的记录,但ID1中还有88的记录,所以会错误地把ID1包含进来。我们的核心逻辑是检查整个ID的所有记录都不包含90,而不是单条记录不等于90。
内容的提问来源于stack exchange,提问作者TestRaptor
相关产品推荐
相关产品推荐

