MySQL:将连接后的多个值组合到一个结果列中

时间:2014-02-04 13:22:17

标签: mysql sql left-join group-concat

我有一个包含发布表的数据库,每个表都可以有多个作者存储在不同的表中。我想查询数据库,在一列中给出一个出版物标题列表,在第二列中给出该出版物的合并作者。

SELECT p.`id`, p.`title`, a.`fullname` 
from `publications` p 
LEFT JOIN `authors` a on a.`publication_id` = p.`id`;

这当然为我提供了多次作者的出版物标题。

id   title              fullname
--   -----              --------
1    Beneath the Skin   Sean French
1    Beneath the Skin   Nicci Gerrard
2    The Talisman       Stephen King
2    The Talisman       Peter Straub

对ID进行分组会为每个标题提供一位作者:

SELECT p.`id`, p.`title`, a.`fullname` 
from `publications` p 
LEFT JOIN `authors` a on a.`publication_id` = p.`id` 
GROUP BY a.`id`;

id   title              fullname
--   -----              --------
1    Beneath the Skin   Sean French
2    The Talisman       Stephen King

我正在寻找的结果是:

id   title              fullname
--   -----              --------
1    Beneath the Skin   Sean French, Nicci Gerrard
2    The Talisman       Stephen King, Peter Straub

我认为应该在使用GROUP_CONCAT时找到答案,但我能得到的唯一结果是所有作者的一个结果行:

SELECT p.`id`, p.`title`, GROUP_CONCAT(a.`fullname`) from `publications` p 
LEFT JOIN `authors` a on a.`publication_id` = p.`id` 
GROUP BY a.`id`;

id   title              fullname
--   -----              --------
1    Beneath the Skin   Sean French, Nicci Gerrard, Stephen King, Peter Straub

在连接后使用GROUP_CONCAT给我一个“每个派生表必须有自己的别名”错误。

SELECT p.`id`, p.`title`, a.`fullname` 
FROM `publications` p 
LEFT JOIN (SELECT GROUP_CONCAT(a.`fullname`) FROM `authors` a) ON a.`publication_id` = p.`id`;

任何线索?

2 个答案:

答案 0 :(得分:11)

您需要按SELECT列中的所有非聚合列进行分组(并且显式地,不是作者ID,因为author.id不是选择列表的一部分):

SELECT p.`id`, p.`title`, GROUP_CONCAT(a.`fullname` separator ', ')
from `publications` p 
LEFT JOIN `authors` a on a.`publication_id` = p.`id` 
GROUP BY p.`id`, p.`title`;

答案 1 :(得分:3)

斯图尔特的答案很好。这只是为了显示您的方法的工作版本:

SELECT p.`id`, p.`title`, a.`fullname`
FROM `publications` p LEFT JOIN
      (SELECT publication_id, GROUP_CONCAT(a.`fullname` separator ', ')
       FROM `authors` a
       GROUP BY publication_id
      ) a
--------^
      ON a.`publication_id` = p.`id`;

您得到的错误是因为子查询后缺少a。子查询也需要修复,以便在publication_idselect子句中包含group by