mysql – 如何在给定列表的* all *项目上过滤JOIN(例如,过滤带有所有给定标签的文章)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 如何在给定列表的* all *项目上过滤JOIN(例如,过滤带有所有给定标签的文章),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1245字,纯文字阅读大概需要2分钟。
内容图文
![mysql – 如何在给定列表的* all *项目上过滤JOIN(例如,过滤带有所有给定标签的文章)](/upload/InfoBanner/zyjiaocheng/896/7b417676a16f451eb3180dd69e1f6b92.jpg)
我有这个用例似乎很平常,但我没有找到任何有效和明显的解决方案.
我有一个文章表,一个标签表和一个中间的article_tag表(每篇文章可以有多个标签,每个标签可以链接到多个文章).
给定标签ID 1,2,3的列表,我想要同时检索具有所有这些标签的文章.
我很容易设法检索此列表中至少有一个标记的文章:
SELECT * FROM article a
JOIN article_tag at ON at.article_id = a.id AND at.tag_id IN (1, 2, 3)
此查询可以返回仅包含1个标记的文章(例如,id为2).但这不是我想要的.我只想要带有3个精确标签1,2和3的文章.
如何以有效的方式做到这一点?有很多文章,我关心表演.
谢谢!
解决方法:
恕我直言,确保它的最佳方法是使用EXISTS逐个检查每个条件:
select a.*
from __articles a
where exists (select 1 from __articles_tags where artid = a.artid and tagid = 1)
and exists (select 1 from __articles_tags where artid = a.artid and tagid = 2)
and exists (select 1 from __articles_tags where artid = a.artid and tagid = 3);
根据您的表架构,您可以使用GROUP BY和COUNT来选择哪些文章具有所需的标签.
select artid
from articles_tags
where tagid in (1,2,3)
group by artid
having count(*) = 3
然后使用结果列表获取文章记录.
select *
from articles
where artid in (select artid
from articles_tags
where tagid in (1,2,3)
group by artid
having count(*) = 3);
在这里查看:http://rextester.com/LOB71207
内容总结
以上是互联网集市为您收集整理的mysql – 如何在给定列表的* all *项目上过滤JOIN(例如,过滤带有所有给定标签的文章)全部内容,希望文章能够帮你解决mysql – 如何在给定列表的* all *项目上过滤JOIN(例如,过滤带有所有给定标签的文章)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。