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

MySQL查询无指定cat_id关联的entry_id问题求助

解决MySQL中查找未关联特定cat_id的entry_id问题

嘿,这个问题我做项目时也碰到过,其实有几种实用又高效的解法,咱们来逐个拆解:

方法一:使用NOT EXISTS子查询(逻辑最直观)

这种写法思路很清晰:对每个entry_id,检查它是否存在cat_id=1235的记录,如果不存在,就把这个entry_id筛选出来。要是表上有合适的索引,这个方法性能会非常好。

SELECT DISTINCT entry_id
FROM your_table t1
WHERE NOT EXISTS (
    SELECT 1
    FROM your_table t2
    WHERE t2.entry_id = t1.entry_id
      AND t2.cat_id = 1235
);

这里加DISTINCT是因为同一个entry_id可能对应多个不同的cat_id(除了1235),我们只需要每个符合条件的entry_id出现一次。

方法二:LEFT JOIN + IS NULL(经典反连接写法)

这是另一种常用的反连接思路,通过左连接筛选出没有匹配特定cat_id的记录:

SELECT DISTINCT t1.entry_id
FROM your_table t1
LEFT JOIN your_table t2
  ON t1.entry_id = t2.entry_id
  AND t2.cat_id = 1235
WHERE t2.entry_id IS NULL;

原理是:把原表和仅包含cat_id=1235的记录做左连接,那些在右表中没有匹配到的行(也就是t2.entry_id为NULL的行),对应的entry_id就是我们要找的目标。

方法三:GROUP BY + HAVING(适合统计场景)

如果需要同时查看每个entry_id的cat_id分布情况,这种分组统计的写法会很方便:

SELECT entry_id
FROM your_table
GROUP BY entry_id
HAVING SUM(CASE WHEN cat_id = 1235 THEN 1 ELSE 0 END) = 0;

逻辑是:按entry_id分组后,统计每个组中cat_id=1235的记录数量,数量为0就说明这个entry_id从未关联过1235。这种写法不需要额外加DISTINCT,因为GROUP BY已经自动去重了。

性能小贴士

如果你的表数据量很大,建议给(entry_id, cat_id)这个组合创建联合索引,不管用上面哪种方法,都能大幅提升查询速度。

内容的提问来源于stack exchange,提问作者Micah Sharp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:51:44