我一直在寻找所有的网,要求人们为指导,但似乎没有人知道正确的(相对较快的)问题的解决方案:MySQL的许多一对多的补集
我有三个表,经典多到许多解决方案:
entries
:ID(INT),标题(VARCHAR [255]),内容(文字)tags
:ID(INT),名称(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)。
我知道如何用子查询来做,问题是,它需要很多时间(大约10到15秒需要10万个条目)。有没有办法用JOIN做到这一点?或者我错过了什么?
编辑我想我应该提到我需要一个能够处理数据集而不是单个标签的解决方案,所以用'One','Two'和'Two'替换我的问题中的'One' 'Three','Four'
edit2提供的答案是正确的,但实际上它太慢了。我想让它工作的唯一方法是使用像Lucene或ElasticSearch这样的第三方搜索引擎。
在之前的三分之一时间内(约5秒)做到了这一点,我想这就是在不缓存结果并做出某种魔术巫术技巧的情况下所能获得的最多。非常感谢! – d4rky
随时欢迎您!其实,还有一个想法,我已经更新了我的答案及其实施。你可以试试看吗? –