Как мне создать подзапрос, связывающий 3 таблицы? - PullRequest
0 голосов
/ 22 октября 2019

По сути, мне нужно создать подзапрос, который фильтрует записи базы данных фильмов. Мне нужно найти фильмы, на которых говорят по-японски ('ja') и имеют жанр ('action'). Каждый раз, когда я запускаю приведенный ниже код, я получаю результаты с фильмами на японском языке и боевиками. Но я также получаю фильмы, которые не говорят по-японски, но являются боевиками. Как мне это решить? Заранее спасибо.

SELECT id, title, vote_average FROM Movie
WHERE id IN
(SELECT id FROM HasGenre WHERE genre_id=
    (SELECT genre_id FROM Genre WHERE genre='Action')
)
AND id IN
    (SELECT id FROM HasSpokenLanugage WHERE spoken_language_iso_code='ja')
ORDER BY vote_average DESC;

Таблица фильмов:

Movie_ID |Название
1 |Начало войны
2 |Halo

Таблица жанров:

Genre_ID |Жанр
1 |Ужас
2 |Действие

Таблица HasGenre:

Movie_ID |Genre_ID
1 |Ужас
2 |Действие

Таблица Spoken_language:

Movie_ID |Spoken_language_iso_code
1 |'ja'
2 |'Ан'

1 Ответ

1 голос
/ 22 октября 2019

Вы можете использовать простой JOIN для получения результата.

SELECT m.id, m.title, m.vote_average
FROM Movie m
JOIN HasGenre hg ON hg.id = m.id
JOIN Genre g ON g.genre_id = hg.genre_id
JOIN HasSpokenLanugage hsl ON hsl.id = m.id
WHERE g.genre = 'Action' AND hsl.spoken_language_iso_code = 'ja'
ORDER BY vote_average DESC;

Если вам нужно использовать подзапрос, вы можете использовать EXIST

SELECT id, title, vote_average 
FROM Movie m
WHERE EXISTS (
    SELECT 1 
    FROM HasGenre WHERE genre_id = (
        SELECT genre_id FROM Genre WHERE genre='Action'
    ) AND id = m.id
) AND EXISTS (
    SELECT 1
    FROM HasSpokenLanugage 
    WHERE spoken_language_iso_code='ja' AND id = m.id
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...