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

如何编写MySQL查询语句获取同时包含指定分类ID的新闻ID

Hey,我来帮你解决这个问题!首先看你写的SQL,语法上有个小错误——SELECT DISTINCT FROM这里漏写了要查询的列news_id,不过就算修正这个问题,还有更简洁高效的写法,下面给你几种可行的解决方案:

正确的MySQL查询方案

方法1:修正你的IN子查询写法

你的思路没问题,只需要补全DISTINCT后的列名,就能正常运行:

SELECT DISTINCT news_id 
FROM news_to_category 
WHERE news_id IN (SELECT DISTINCT news_id FROM news_to_category WHERE category_id = 1) 
  AND news_id IN (SELECT DISTINCT news_id FROM news_to_category WHERE category_id = 2);

这个语句的逻辑是:先分别找出属于分类1和分类2的新闻ID集合,再取两个集合的交集,最终得到同时属于两个分类的新闻ID。DISTINCT用来避免结果出现重复的新闻ID。

方法2:使用GROUP BY + HAVING(更高效推荐)

这种方法扩展性更强,比如以后需要同时匹配3个甚至更多分类,只需要修改HAVING子句即可:

SELECT news_id
FROM news_to_category
WHERE category_id IN (1, 2) -- 先过滤出目标分类的关联记录
GROUP BY news_id
HAVING COUNT(DISTINCT category_id) = 2; -- 确保该新闻同时包含两个目标分类

原理说明:

  1. 先筛选出所有分类为1或2的关联记录,减少后续处理的数据量;
  2. 按news_id分组,把同一个新闻的所有分类记录聚合到一起;
  3. 通过COUNT(DISTINCT category_id) = 2判断:只有当该新闻同时拥有两个不同的目标分类时,计数才会等于2。如果你的表保证了news_id和category_id的唯一性(没有重复关联),也可以去掉DISTINCT,直接用COUNT(*) = 2。

方法3:使用JOIN关联表

通过两次关联同一个表,分别匹配分类1和分类2的记录,直接得到符合条件的新闻ID:

SELECT DISTINCT n1.news_id
FROM news_to_category n1
INNER JOIN news_to_category n2 
  ON n1.news_id = n2.news_id
WHERE n1.category_id = 1 
  AND n2.category_id = 2;

这个方法的逻辑是:找到所有属于分类1的记录,再关联同新闻ID下属于分类2的记录,能直接筛选出同时存在两个分类关联的新闻。

以上三种方法都能得到你预期的结果:1、2、3、4,你可以根据自己的实际场景选择最合适的写法~

内容的提问来源于stack exchange,提问作者nm-rbrauner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:37:47