@asdzxx

Как (быстро) выбрать книги, у которых есть все нужные авторы?

Есть таблица, которая содержит список авторов каждой из книг:
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


Возможно, я сильно усложняю, и есть какой-то более простой вариант для такого запроса?
Если нет, то какие есть варианты улучшить его скорость?
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы