MySQL一对多关联查询:将查询结果拆分至不同列展示
解决思路:用条件聚合避免重复关联表
嘿,我懂你不想反复关联同一张表的想法——重复关联不仅代码看着啰嗦,还可能拖慢查询速度。咱们换个思路,用条件聚合的方式来实现你要的行列转换,只需要关联两次表就能搞定,代码更简洁高效。
具体SQL实现
SELECT b.ID AS `BOOK ID`, b.Title, MAX(CASE WHEN bc.Type = 'Author' THEN c.Title END) AS Author, MAX(CASE WHEN bc.Type = 'Editor' THEN c.Title END) AS Editor, MAX(CASE WHEN bc.Type = 'Publisher' THEN c.Title END) AS Publisher FROM Book b LEFT JOIN Book_Collaborators bc ON b.ID = bc.BookID LEFT JOIN Collaborators c ON bc.COLLAB_ID = c.ID GROUP BY b.ID, b.Title
代码解释
- 先通过
LEFT JOIN关联Book和Book_Collaborators,这样哪怕某本图书没有任何协作方记录,也能被保留在结果里 - 再关联一次
Collaborators,拿到每个协作方的名称 - 用
CASE WHEN判断协作方类型,只把对应类型的名称留下来,其他类型的位置返回NULL - 最后按图书的
ID和Title分组,用MAX函数把每组里的NULL过滤掉,就能得到每个类型对应的唯一协作方名称(如果某类型没有记录,对应列会显示NULL,完全符合你的需求)
这种写法相比你之前多次关联表的方式,代码更紧凑,维护起来也更方便,而且查询性能通常也更好哦。
内容的提问来源于stack exchange,提问作者Deadfish
相关产品推荐
相关产品推荐

