在 MySQL 查询中组合字段

Posted

技术标签:

【中文标题】在 MySQL 查询中组合字段【英文标题】:Combining Fields In MySQL Query 【发布时间】:2011-06-28 16:40:36 【问题描述】:

我有三个 InnoDB mysql 表。一个有一个书籍列表,其中包含 book_id、名称和项目链接的字段。另一个是作者表,包括 author_id、名字和姓氏,最后一个表是要作者的书籍索引。有些作品有不止一位作者。

我正在尝试编写一个查询来提取所有书籍,并在作者字段中显示给定标题的所有作者。例如,如果我想要一个图书列表,查询将返回图书 ID、图书名称、我可以下载图书的链接以及图书所有作者的姓名。假设有 2 位或更多作者,我怎样才能将所有作者姓名放入一个字段中?

这是我目前所拥有的:

SELECT b.book_id, book_title, link_src, CONCAT(a.firstname, ' ',a.lastname) AS author from books AS b
JOIN author_to_books AS atb ON b.book_id = atb.book_id
JOIN authors AS a ON atb.author_id = a.author_id

这为同一本书提供了两个单独的行。例如,如果测试书 1 有 Joe Public 和 John Smith 作为作者,我会得到两行相同的书 ID。我只想在作者字段中包含两位作者的一行。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

为此,您需要GROUP_CONCAT。

快速示例:

SELECT b.book_id, book_title, link_src, 
 GROUP_CONCAT(CONCAT(a.firstname, ' ',a.lastname)) AS author 
FROM books AS b
JOIN author_to_books AS atb ON b.book_id = atb.book_id
JOIN authors AS a ON atb.author_id = a.author_id
GROUP BY book_id

但通常您最好在应用程序代码中执行此操作(此后,您还需要将“作者”设为可点击链接等)。

【讨论】:

【参考方案2】:

参见GROUP_CONCAT() 函数。

SELECT b.book_id, b.book_title, b.link_src, 
  GROUP_CONCAT( CONCAT(a.firstname, ' ',a.lastname) ) AS authors 
FROM books AS b
JOIN author_to_books AS atb ON b.book_id = atb.book_id
JOIN authors AS a ON atb.author_id = a.author_id
GROUP BY b.book_id

【讨论】:

以上是关于在 MySQL 查询中组合字段的主要内容,如果未能解决你的问题,请参考以下文章

MySQL例题一 综合案例(多条件组合查询)

mysql组合索引与字段顺序

用PHP+mysql查询两个表,然后怎么样把已经查出来的两个数组合并在一起,两张表里有一个相同的字段

mysql中如何在上一次的查询结果中再次查询

mysql索引

mysql查询以查找具有班级组合的学生[重复]