Я искал по всей сети и просил людей за советом, но никто, кажется, не знает правильного (относительно быстрого) решения проблемы:
У меня есть три таблицы, классическое решение «многие ко многим»:
entries
: id (int), заголовок (varchar [255]), контент (текст)
tags
: id (int), имя (varchar [255]), слизень (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).
Я знаю, как это сделать с подзапросом, проблема в том, что это занимает много времени (при 100 тыс. Записей это заняло около 10-15 секунд). Есть ли способ сделать это с JOINS? Или я что-то упустил?
edit Полагаю, я должен был упомянуть, что мне нужно решение, которое работает с наборами данных, а не с отдельными тегами, поэтому замените «One» в моем вопросе на «One», «Two» и « Два с «Три», «Четыре»
edit2 Ответ правильный, но он слишком медленный для практического использования. Я думаю, что единственный способ заставить это работать - использовать стороннюю поисковую систему, такую как Lucene или ElasticSearch.