mysql - MySQL - 一对多查询,结果在单独的列中
问题描述
我有一个结构类似于下面提到的格式的表。他们看起来像这样
书
| 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)
解决方案
显示所有书籍信息,无论它在 book_collaborator 表中是否具有相关值。如果只需要相关值,则使用 INNER JOIN 而不是 LEFT JOIN。由于 book id 在 book 表中是唯一的,因此在 title 列使用聚合函数以避免它添加 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
请从网址https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=069dc205f176968d61d462ad3cad7568检查
推荐阅读
- docker - 带有 zip 文件的 Docker ADD 文件夹导致错误处理 tar 文件(退出状态 1):意外 EOF
- reporting-services - SSRS 根据某个值将背景更改为红色,否则将恢复为备用行颜色
- mysql - 查询显示被请求少于 3 次的服务
- hive - 如何将特定数据从 HDFS 加载到 HIVE
- android - 使用改造库时不调用 onResponse 方法
- winforms - 检测键组合 C# Winform
- javascript - Vue 大喊对象未定义,同时它在需要加载它的范围内
- asp.net-core - 优雅关闭:AppDomain.CurrentDomain.ProcessExit 与 appLifetime.ApplicationStopping.Register 有什么区别?
- javascript - Chrome:某些图表出现错误时,将 Highcharts 导出为 svg 格式
- javascript - Javascript 和数据库,特殊符号无法正确显示