Изберете редове в таблица 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);

Търсите напр. Списъкът с филми, съдържащи Алис и Боб, трябва да ми даде само Матрицата

Най-близкото до което съм стигнал е тази заявка, която избира филми с any< /em> от моя списък с актьори, а не такива с всички.

Търсейки в StackOverflow подобни отговори, получих това, което работи добре в 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