Выберите строки в таблице A, которые соединяются со всем набором элементов из таблицы B.

Основано на этом изображении (но забудьте "жанр"):

У меня есть список актеров, и мне нужно получить список фильмов, в которых есть каждый актер из моего списка.

Пример данных:

INSERT INTO actor (actor_id, name) VALUES
    (1, "Alice"), (2, "Bob");

INSERT INTO film (film_id, title) VALUES
    (1, "Star Wars"), (2, "The Matrix"), (3, "Lion King);

INSERT INTO actor_film_mapping (actor_id, film_id) VALUES
    (1, 1),
    (1, 2), (2, 2),
    (2, 3);

Ищете, например. Список фильмов с участием Алисы и Боба должен дать мне только Матрица

Самое близкое, что я нашел, это этот запрос, который выбирает фильмы с любым< /em> из моего списка актеров, а не с всеми.

Глядя на StackOverflow для похожих ответов, я получил through-a-jun/29991705#29991705">это, которое отлично работает в MSSQL, но не в MySQL.

Надеюсь, я правильно сформулировал этот вопрос. Я новичок в StackOverflow


person lbrentcarpenter    schedule 23.05.2016    source источник


Ответы (1)


Вы довольно близко. Вместо использования select distinct выполните агрегацию и подсчитайте количество совпадений, используя having:

SELECT f.*
FROM film f INNER JOIN
     actor_film_mapping afm
     ON f.film_id = afm.film_id
WHERE afm.actor_id IN (1, 2)
GROUP BY f.film_id
HAVING COUNT(*) = 2;
person Gordon Linoff    schedule 23.05.2016
comment
Выглядит неплохо! Итак, если бы я должен был изменить список (или, в моем случае, сгенерировать его программно), нужно ли было бы мне изменить COUNT на длину списка? - person lbrentcarpenter; 23.05.2016
comment
Отличный ответ. Я все еще новичок в sql. Мне было интересно, сработает ли мой оператор sql: SELECT film_id, COUNT(film_id) as actor_count FROM actor_film_mapping GROUP BY film_id WHERE actor_count = (SELECT COUNT(actor_id) FROM actor); Я недостаточно уверен в нем, чтобы опубликовать ответ. - person Webeng; 23.05.2016