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

