如何在多对多关系下筛选匹配指定用户标签的文章数据
实现方案
这里提供两种常用的实现逻辑,可根据数据量和业务需求选择:
方案1:INNER JOIN + 去重(逻辑直观)
通过关联表匹配对应用户的收藏标签,最后对文章结果去重,适合中小数据量场景:
SELECT DISTINCT a.Article_id, a.Article_name FROM Articles a INNER JOIN Article_Tags at ON a.Article_id = at.Article_id INNER JOIN Users_Tags ut ON at.tag_id = ut.tag_id WHERE ut.User_id = '要查询的用户ID,比如User1';
查询User1时返回结果为:
| Article_id | Article_name |
|---|---|
| 1 | Dogs |
| 3 | Sheep |
方案2:EXISTS子查询(性能更优)
无需额外去重,匹配到符合条件的关联关系就直接返回结果,大数据量下执行效率更高:
SELECT a.Article_id, a.Article_name FROM Articles a WHERE EXISTS ( SELECT 1 FROM Article_Tags at INNER JOIN Users_Tags ut ON at.tag_id = ut.tag_id WHERE at.Article_id = a.Article_id AND ut.User_id = '要查询的用户ID,比如User1' );
如果需要输出带匹配标签的明细(即参考示例格式,保留重复文章条目),去掉DISTINCT同时返回tag_id字段即可:
SELECT a.Article_id, a.Article_name, at.tag_id FROM Articles a INNER JOIN Article_Tags at ON a.Article_id = at.Article_id INNER JOIN Users_Tags ut ON at.tag_id = ut.tag_id WHERE ut.User_id = 'User1';
内容的提问来源于stack exchange,提问作者tagger
相关产品推荐
相关产品推荐

