MySQL — Запрос «Один ко многим» с результатами в отдельных столбцах

#mysql #database #one-to-many

Вопрос:

У меня есть таблица со структурой, аналогичной формату, указанному ниже. Они выглядят так

Книга

 | ID | Title |
| 1  | A     |
| 2  | B     |
 

Book_Collaborators

 | COLLAB_ID |BookID | Type      |
| 1         | 1     | Author    |
| 2         | 1     | Editor    |
| 3         | 1     | Publisher |
 

Соавторы

 | ID | Title |
| -- | ----- |
| 1  | D     |
| 2  | E     |
| 3  | F     |
 

Мне нужны результаты в следующем формате, где такие сведения, как автор, редактор и издатель, отображаются в разных столбцах.

Просто следует отметить, что в некоторых случаях детали могут отсутствовать в таблице Book_Collaborators

 | BOOK ID   | Title  | Author | Editor | Publisher |
| --------- | -----  |------  | ------ | --------- | 
| 1         | A      | D      | E      | F         |
 

Я придумал этот запрос, но я не хочу несколько раз присоединяться к одной и той же таблице

 select book.id as BookId, c.title as Author,c1.title as Editor
from Book book
left join Book_Collaborators bc on (book.id=bc.book_id and bc.type='Author')
left join Collaborators c on (bc.COLLAB_ID=c.id)
left join Book_Collaborators bc1 on (book.id=bc1.book_id and bc1.type='Editor')
left join Collaborators c1 on (bc1.COLLAB_ID=c1.id)
 

Комментарии:

1. Когда таблицы book_collaborator будут заполнены пустыми, что вы хотите показать? В соответствии с вашими данными для книги 2 в таблице book_collaborators нет информации. Вы хотите показать книгу 2 с нулевым значением в поле автор, редактор и издатель.

2. Да, я хочу показать нулевое значение в случае, если данные соавтора не существуют для книги

Ответ №1:

Покажите всю информацию о книге, либо она имеет соответствующее значение в таблице book_collaborator, либо нет. Если требуется только связанное значение, используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо ЛЕВОГО СОЕДИНЕНИЯ. Поскольку идентификатор книги уникален в таблице книг, поэтому агрегатная функция используется в столбце заголовка, чтобы избежать добавления предложения GROUP BY.

 -- MySQL
SELECT b.id BOOK_ID
     , MAX(b.title) Title
     , MAX(CASE WHEN bc.btype = 'Author' THEN c.title END) Author
     , MAX(CASE WHEN bc.btype = 'Editor' THEN c.title END) Editor
     , MAX(CASE WHEN bc.btype = 'Publisher' THEN c.title END) Publisher
FROM Book b
LEFT JOIN Book_Collaborators bc
       ON b.id = bc.book_id
LEFT JOIN Collaborators c
       ON c.id = bc.collab_id
GROUP BY b.id
 

Пожалуйста, проверьте по URL https://dbfiddle.uk/?rdbms=mysql_8.0amp;fiddle=069dc205f176968d61d462ad3cad7568