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

MySQL查询需求:筛选用户48标签匹配且未被忽略的文章

解决你的文章筛选SQL问题

没问题,我来帮你写出符合需求的SQL查询!先理清楚你的核心需求:

  • 目标用户:user_id = 48
  • 筛选条件1:文章至少有一个标签和该用户的标签匹配
  • 筛选条件2:该文章没有被用户48忽略

先确认下:你提供的article_ignored表结构里的id字段应该是被忽略的文章ID(对应article_tag里的article_id)吧?如果是这样,下面的查询就完全适用。

方案一:使用INNER JOIN + NOT EXISTS(推荐,性能更优)

SELECT DISTINCT at.article_id
FROM article_tag at
-- 关联用户48的标签,筛选出标签匹配的文章记录
INNER JOIN user_tag ut 
  ON at.tag_id = ut.tag_id 
  AND ut.user_id = 48
-- 排除被用户48忽略的文章
WHERE NOT EXISTS (
    SELECT 1
    FROM article_ignored ai
    WHERE ai.user_id = 48 
      AND ai.id = at.article_id
);

方案二:使用LEFT JOIN + IS NULL

如果更习惯用JOIN的方式,也可以这么写:

SELECT DISTINCT at.article_id
FROM article_tag at
INNER JOIN user_tag ut 
  ON at.tag_id = ut.tag_id 
  AND ut.user_id = 48
-- 左连接忽略表,匹配用户48的忽略记录
LEFT JOIN article_ignored ai 
  ON ai.id = at.article_id 
  AND ai.user_id = 48
-- 只保留没有被忽略的文章(也就是左连接后没有匹配到忽略记录的)
WHERE ai.id IS NULL;

关键逻辑解释

  • INNER JOIN user_tag:只保留那些标签和用户48的标签完全匹配的文章标签记录,确保筛选出的文章至少有一个标签符合用户兴趣。
  • DISTINCT:因为一篇文章可能有多个标签匹配用户标签,用这个关键字避免同一文章ID重复出现。
  • 排除忽略文章:两种方案都是通过关联article_ignored表,过滤掉用户48已经标记为忽略的文章。NOT EXISTS在大多数数据库中性能会更稳定,尤其是当article_ignored表有(user_id, id)的联合索引时。

如果article_ignored表的结构和我理解的不一样(比如id是自增主键,另有article_id字段),你可以随时说明,我再调整查询语句!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:49:59