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
相关产品推荐
相关产品推荐

