Итак, мы снова встретимся. Надеюсь, у меня будет такая же помощь, как и ваш последний вопрос. Мне нравится, что вы начали, разбив это на более мелкие части. Я бы начал с того же места, что и вы, - заставляя всех актеров в нужный фильм. Я немного изменил ваш запрос, выбрав идентификатор лиц вместо имени, чтобы сохранить этот ответ немного короче и чище.
SELECT c.person_id
FROM cast_info c
JOIN title t ON c.movie_id = t.id
JOIN role_type r ON c.role_id = r.id
WHERE t.title = 'The Movie' AND (r.role = 'actress' OR r.role = 'actor');
* Обратите внимание, что я не использовал отчетливый здесь потому, что человек не должен появляться в этом фильме в качестве актера или актрисы более чем один раз, но c.person_id не является уникальным ключом, так что не мешало бы быть конечно.
Затем мы можем получить все фильмы с участием этих актеров. Мы можем фильтровать, чтобы избежать исходной таблицы.
SELECT t.id
FROM title t
JOIN cast_info c ON c.movie_id = t.id
WHERE t.title != 'The Movie'
AND c.person_id IN(SELECT c.person_id
FROM cast_info c
JOIN title t ON c.movie_id = t.id
JOIN role_type r ON r.id = c.role_id
WHERE t.title = 'The Movie' AND (r.role = 'actress' OR r.role = 'actor'))
Теперь мы можем вытащить всех актеров из всех этих фильмов и исключить наших оригинальных актеров. Здесь полезно использовать отдельный идентификатор личности. Это потому, что Боб может сыграть главную роль в фильме «Кино». Позже Боб сделал фильм с Джоном и еще один фильм с Джоном, но мы не хотим, чтобы Джон появлялся дважды.
Итак, вот окончательный запрос:
SELECT DISTINCT c.person_id
FROM cast_info c
WHERE c.movie_id IN(SELECT t.id
FROM title t
JOIN cast_info c ON c.movie_id = t.id
WHERE t.title != 'The Movie'
AND c.person_id IN(SELECT c.person_id
FROM cast_info c
JOIN title t ON c.movie_id = t.id
JOIN role_type r ON r.id = c.role_id
WHERE t.title = 'The Movie' AND (r.role = 'actress' OR r.role = 'actor')))
AND c.person_id NOT IN(SELECT c.person_id
FROM cast_info c
JOIN title t ON c.movie_id = t.id
JOIN role_type r ON r.id = c.role_id
WHERE t.title = 'The Movie' AND (r.role = 'actress' OR r.role = 'actor'))
Как я уже говорил раньше, это трудно проверить это без данных, и это очень много таблиц, чтобы сделать простой SQL скрипку, поэтому, пожалуйста, попробуйте они в битах, как я написал их, если они не работают, и дайте мне знать, что, возможно, потребуется изменить.
Почему вы используете cross join для role_type? Почему бы не использовать внутреннее соединение row_type на c.role_id = r.id? –
Вы должны опубликовать некоторые выборочные данные и ожидаемый результат, чтобы уточнить свой вопрос. –
Я отправил это @JaugarChang –