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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:41:16