8.9Kпросмотров
82.1%от подписчиков
18 августа 2025 г.
📷 ФотоScore: 9.8K
Задача из собеседования (Cian, middle): считаем, сколько раз издавалось произведение 📚 Схема:
🔹Books(id, title) — произведение
🔹BookEditions(id, book_id, publish_year, pages) — издание произведения
🔹BookCopies(id, edition_id, inventory_num) — экземпляр издания 🎯 Формулировка
Найти произведения, которые издавались более 5 раз. Вывести только название произведения (title). 🧪 Сначала решите сами!
Откройте задачу и попробуйте написать запрос без подсказок:
👉 https://sql-academy.org/ru/trainer/tasks/125 — Разбор —— Как подойти шаг за шагом:
1️⃣ Что нужно посчитать? Количество изданий на каждое произведение → считаем строки в BookEditions по book_id. 2️⃣ Где лежит название? В Books. Значит, к агрегату нужно присоединить Books по Books.id = BookEditions.book_id. 3️⃣ По чему группировать? По уникальному идентификатору книги (и для вывода — по названию): GROUP BY b.id, b.title. 4️⃣ Как отфильтровать только те, у кого >5 изданий? Через HAVING, потому что фильтруем по агрегату (COUNT). Правильный ответ SELECT b.title
FROM BookEditions e
JOIN Books b ON b.id = e.book_id
GROUP BY b.id, b.title
HAVING COUNT(e.id) > 5; На что обратить внимание ❗️
🔹Группируем по b.id, b.title, а не только по b.title: два разных произведения могут теоретически иметь одинаковое название; по id безопаснее. А если в условии скрыт нюанс «издавалось в разные годы»?
Иногда собеседующий подразумевает уникальные годы издания. Тогда используйте COUNT(DISTINCT e.publish_year) SELECT b.title
FROM BookEditions e
JOIN Books b ON b.id = e.book_id
GROUP BY b.id, b.title
HAVING COUNT(DISTINCT e.publish_year) > 5;