如何编写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或2的关联记录,减少后续处理的数据量;
- 按
news_id分组,把同一个新闻的所有分类记录聚合到一起; - 通过
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
相关产品推荐
相关产品推荐

