akserdin
@akserdin
PHP/JS developer

SQL запрос из 3 таблиц по 2-м связующим — возможно ли такое?

Есть такие сущности - Книга, Автор, Рубрика. У книги может быть несколько авторов, книга может принадлежать нескольким рубрикам, автор может написать много книг. Учитывая это, спроектировал таблицы так:

books - id, title
authors - id, name, surname
topics - id, title

связующие таблицы
book_author - book_id, author_id
book_topic - book_id, topic_id

Как составить запрос, чтобы вывести список всех книг с соответствующими им рубриками и авторами? Подозреваю, что это будет смесь вложенных select и нескольких join, но никак не получается слепить.
  • Вопрос задан
  • 3148 просмотров
Пригласить эксперта
Ответы на вопрос 2
AMar4enko
@AMar4enko
SELECT books.*, topics.id as topic_id, topics.title as author_title, authors.id as author_id, authors.name as author_name FROM books
LEFT JOIN book_author ON book_author.book_id = books.id
LEFT JOIN book_topic ON book_topic.book_id = books.id
LEFT JOIN authors ON book_author.author_id = authors.id
LEFT JOIN topics ON book_topic.topic_id = topics.id

Только учтите, что при двух авторах и трех рубриках в одной книге вы получите 6 результирующих строк.
Ответ написан
Комментировать
@bobzer
Java EE Developer
Добавлю немного магии к ответу AMar4enko:

SELECT books.title,
GROUP_CONCAT(distinct CONCAT(authors.surname, ' ', authors.name) SEPARATOR ', ') as autors,
GROUP_CONCAT(distinct topics.title ORDER BY topics.title ASC SEPARATOR ', ') as titles
FROM books
LEFT JOIN book_author ON book_author.book_id = books.id
LEFT JOIN book_topic ON book_topic.book_id = books.id
LEFT JOIN authors ON book_author.author_id = authors.id
LEFT JOIN topics ON book_topic.topic_id = topics.id
group by books.id


Этот SQL-запрос решает проблему дублирования книг при нескольких авторах и нескольких рубриках
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы