Задачи на JOIN в SQL
JOIN·junior

Пары «фильм — категория»

Задача

Аналитик контента начинает исследование жанров и просит заготовку: «Дай мне простыню „фильм — его категория“. Дальше я сам буду крутить, но сперва нужен базовый список названий с жанром. Первые 20 по алфавиту названий — на посмотреть формат».

Верни название фильма и название его категории.

Схема данных

Учебная база проката dvdrental. Связь фильма и жанра хранится через отдельную таблицу-связку:

  • film(film_id, title, ...) — каталог фильмов.
  • film_category(film_id, category_id) — связка: какой фильм к какой категории относится.
  • category(category_id, name, ...) — справочник жанров.

Решение

SELECT f.title, cat.name AS category
FROM film f
JOIN film_category fc ON fc.film_id = f.film_id
JOIN category cat ON cat.category_id = fc.category_id
ORDER BY f.title, cat.name
LIMIT 20;

Разбор

Модель тут заложена «на вырост»: film_category — связующая (junction) таблица для связи «многие-ко-многим». В принципе фильм мог бы относиться к нескольким жанрам, а жанр — содержать много фильмов; такая схема это позволяет. В учебной базе dvdrental по факту у каждого фильма ровно одна категория, поэтому наш список получается «один к одному», но джойн строим по-взрослому — через связку, чтобы запрос не сломался, если завтра фильму добавят второй жанр.

Соединяем в два прыжка: filmfilm_category по film_id, затем film_categorycategory по category_id. Оба — INNER JOIN, так что в результат попадают только фильмы, у которых категория проставлена (в этой базе — все). Название жанра берём из справочника category.name, а не пытаемся хранить его в фильме: справочник — единый источник правды, переименуют жанр один раз, и он поменяется во всех парах.

ORDER BY f.title, cat.name даёт стабильный порядок; названия фильмов в dvdrental уникальны, так что первого ключа хватило бы, но второй ключ — дешёвая страховка от неоднозначности. LIMIT 20 отрезает витрину для примера.

Такая же схема связки, только между фильмами и актёрами, разбирается в задаче актёры конкретного фильма. А если поверх этих пар посчитать выручку по жанрам — получится задача выручка по категориям фильмов.

Ожидаемый результат

title | category
--- | ---
Academy Dinosaur | Documentary
Ace Goldfinger | Horror
Adaptation Holes | Documentary
Affair Prejudice | Horror
African Egg | Family
Agent Truman | Foreign
Airplane Sierra | Comedy
Airport Pollock | Horror
Alabama Devil | Horror
Aladdin Calendar | Sports
… всего строк: 20 (показаны первые 10)

Прорешай такие задачи сам

Читать разбор полезно, а настоящая прокачка — самому писать запросы и получать обратную связь. В симуляторе живая база и проверка запросов, лёгкий режим — бесплатно.

Прорешать в бесплатной песочнице

Смежные задачи

Вопросы по теме