Все привет!
У меня есть БД с фильмами, в которой есть следующие таблицы:
- countries (code, name)
- genres (id, name)
- movies (id, title, description)
- movie_genres (movie_id, genre_id)
- movie_countries (movie_id, country_code)
Задача:
Необходимо выбрать все фильмы, жанры и страны которых находятся в определенном списке.
Например, выбрать фильмы, у которых страны "Россия"
И "Япония" + жанры "Боевик"
И "Комедия"
И "Ужасы".
Мой вариант решения:
SELECT m.*
FROM movies m
WHERE m.id IN (
SELECT groupped_movies.id
FROM (
SELECT m.id,
array_agg(mc.country_code) country_codes,
array_agg(mg.genre_id) genre_ids
FROM movies m
LEFT JOIN movie_countries mc on m.id = mc.movie_id
LEFT JOIN movie_genres mg on m.id = mg.movie_id
GROUP BY m.id
) groupped_movies
WHERE groupped_movies.country_codes @> ARRAY ['ru', 'ja'] AND groupped_movies.genre_ids @> ARRAY [1, 2, 3]);