-- Вывести все книги и их авторов/соавторов в простом табличном виде.

Для связи книг и соавторов нужна таблица многие-ко-многим. LEFT JOIN сохраняет книги без автора и авторов без книг; COUNT считают по идентификатору книги.

Короткий ответ

Что ответить на собеседовании

Для связи книг и соавторов нужна таблица многие-ко-многим. LEFT JOIN сохраняет книги без автора и авторов без книг; COUNT считают по идентификатору книги.

Подробный разбор

Ответ с пояснениями

Условие

-- Вывести все книги и их авторов/соавторов в простом табличном виде. -- Пример:

-- book_name | author_name -- --------------------|-------------- -- Мастер и маргарита | Игорь -- Евгений Онегин | Иван

-- Вывести всех авторов и кол-во их книг. -- Пример:

-- author_name | book_count -- ------------|----------- -- Игорь | 2 -- Иван | 1

Ответ

Для связи книг и соавторов нужна таблица многие-ко-многим. LEFT JOIN сохраняет книги без автора и авторов без книг; COUNT считают по идентификатору книги.

Пусть есть books(id, name), authors(id, name), book_authors(book_id, author_id). Названия схемы здесь примерные.

SELECT b.name AS book_name, a.name AS author_name
FROM books b
LEFT JOIN book_authors ba ON ba.book_id = b.id
LEFT JOIN authors a ON a.id = ba.author_id
ORDER BY b.id, a.id;

SELECT a.name AS author_name,
       COUNT(DISTINCT ba.book_id) AS book_count
FROM authors a
LEFT JOIN book_authors ba ON ba.author_id = a.id
GROUP BY a.id, a.name
ORDER BY a.id;

У книги с двумя соавторами будут две строки. Автор без книг получит 0, а не 1: COUNT(*) здесь не подходит. Группировка по id не объединяет разных авторов с одинаковым именем.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее