У меня есть три таблицы: books
, tags
и taggings
(books-xref-tags
):
books
id | title | author
1 | Blink | Malcolm Gladwell
2 | 1984 | George Orwell
taggings
book_id | tag_id
1 | 1
1 | 2
2 | 1
2 | 3
tags
id | name
1 | interesting
2 | nonfiction
3 | fiction
Я хочу найти все книги с тегами "интересные" и "художественная литература". Лучшее, что я придумал, это
select books.* from books, taggings, tags
where taggings.book_id = books.id
and taggings.tag_id = tag.id
and tag.name = "interesting"
intersect
select books.* from books, taggings, tags
where taggings.book_id = books.id
and taggings.tag_id = tag.id
and tag.name = "fiction"
Кажется, это работает, но я не уверен, как это будет масштабироваться, будь то по строкам или по количеству тегов. То есть, что происходит, когда я добавляю сотни книг, сотни тегов и тысячи тегов? Что происходит, когда поиск становится «интересным» и «фантастическим» и «водным» и «каменной кладкой»?
У меня есть альтернативный подход, если нет лучшего способа выполнить запрос непосредственно в SQL:
- выберите все книги с первым тегом вместе со всеми тегами этих книг
- удалить из списка те, у которых не все запрошенные теги