Есть таблица, которая содержит список авторов каждой из книг:
book_id | author_id
1 | 1
2 | 1
2 | 2
3 | 3
...
Мне нужно понять принцип, по которому строится запрос вида "все книги, которые написали одновременно эти авторы" - для общего случая с количеством авторов от ноля до бесконечности.
Лучшее, что я смог придумать - это вариант с GROUP BY / HAVING:
SELECT * FROM table
WHERE author_id = x
OR author_id = y
OR author_id = z /* каждый автор - один OR */
...
GROUP BY book_id
HAVING count(*) = 3 /* общее количество авторов */
Запрос работает, но уже на сотнях тысяч записей в таблице начинает выполнятся несколько секунд (естественно, с проставленным индексом -
(author_id,book_id)).
Я могу придумать запрос с JOIN - но он работает ещё медленнее:
SELECT * FROM table as t1
JOIN table as t2 ON t1.book_id = t2.book_id
JOIN table as t3 ON t1.book_id = t3.book_id
/* каждый автор - один джоин */
WHERE t1.author_id = x
AND t2.author_id = y
AND t3.author_id = z
Возможно, я сильно усложняю, и есть какой-то более простой вариант для такого запроса?
Если нет, то какие есть варианты улучшить его скорость?