#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