首页 / MYSQL / MySQL多对多补充集
MySQL多对多补充集
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL多对多补充集,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1730字,纯文字阅读大概需要3分钟。
内容图文
我一直在寻找网络并向人们寻求指导,但似乎没有人知道问题的正确(相对快速)解决方案:
我有三张桌子,经典的多对多解决方案:
>条目:id(int),title(varchar [255]),content(text)
> tags:id(int),name(varchar [255]),slug(varchar [255])
> entries_tags:id(int),entry_id(int),tag_id(int)
到目前为止没有什么不寻常的.现在让我们说我在标签中有测试数据(因为它们并不重要,所以我要阻止它们):
ID | name
1. | one
2. | two
3. | three
4. | four
5. | five
我还有三个条目:
ID | title
1. | Something
2. | Blah blah blah
3. | Yay!
和关系:
ID | entry_id | tag_id
1. | 1 | 1
2. | 1 | 2
3. | 2 | 1
4. | 2 | 3
5. | 3 | 1
6. | 3 | 2
7. | 3 | 3
8. | 4 | 1
9. | 4 | 4
好的,我们有测试数据.我想知道如何获得所有标记为One的条目,但没有标记Three(即条目1和条目4).
我知道如何用子查询来做,问题是,它需要花费很多时间(100k条目需要大约10-15秒).有没有办法用JOIN做到这一点?或者我错过了什么?
编辑我想我应该提到我需要一个适用于数据集而不是单个标签的解决方案,所以在我的问题中将’One’替换为’One’,’Two’和’Two’与’Three’,’Four “
edit2提供的答案是正确的,但实际使用它太慢了.我认为使其工作的唯一方法是使用像Lucene或ElasticSearch这样的第三方搜索引擎.
解决方法:
以下脚本选择具有标记One和Two且没有标记Three和Four的条目:
SELECT DISTINCT
et.entry_id
FROM entries_tags et
INNER JOIN tags t1 ON et.tag_id = t1.id AND t1.name IN ('One', 'Two')
LEFT JOIN tags t2 ON et.tag_id = t2.id AND t2.name IN ('Three', 'Four')
WHERE t2.id IS NULL
替代解决方案:INNER JOIN替换为WHERE EXISTS,这使我们可以摆脱(相当昂贵的)DISTINCT:
SELECT
et.entry_id
FROM entries_tags et
LEFT JOIN tags t2 ON et.tag_id = t2.id AND t2.name IN ('Three', 'Four')
WHERE t2.id IS NULL
AND EXISTS (
SELECT *
FROM tags t1
WHERE t1.id = et.tag_id
AND t1.name IN ('One', 'Two')
)
内容总结
以上是互联网集市为您收集整理的MySQL多对多补充集全部内容,希望文章能够帮你解决MySQL多对多补充集所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。