在MySQL查询中组合字段

时间:2011-06-28 16:40:37

标签: mysql

我有三个InnoDB mysql表。其中一个包含书籍列表,其中包含book_id,name和项目链接的字段。另一个是作者表,包括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

这给了我同一本书的两个单独的行。例如,如果Test Book 1有Joe Public和John Smith作为作者,我会为同一本书ID获得两行。我想在作者字段中与两位作者只有一行。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您需要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

但通常你会更好地在你的应用程序代码中这样做(因为之后,你会想要让'作者'也成为一个可点击的链接,等等。)

答案 1 :(得分:0)

请参阅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