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

Posted

技术标签:

【中文标题】MySQL:将连接后的多个值组合到一个结果列中【英文标题】:MySQL: combining multiple values after a join into one result column 【发布时间】:2014-02-28 11:53:05 【问题描述】:

我有一个包含出版物表的数据库,每个出版物可以有多个作者,这些作者存储在不同的表中。我想查询数据库,在其中一列中提供出版物标题列表,在第二列中提供该出版物的联合作者。

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`;

有什么线索吗?

【问题讨论】:

【参考方案1】:

您需要按 SELECT 中的所有非聚合列进行分组(明确地,不要按作者 ID 分组,因为作者是 GROUP_CONCAT 的一部分):

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`;

【讨论】:

【参考方案2】:

Stuart 的回答很好。这只是为了展示您的方法的工作版本:

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 在子查询之后丢失了。子查询也需要修复,在selectgroup by 子句中包含publication_id

【讨论】:

以上是关于MySQL:将连接后的多个值组合到一个结果列中的主要内容,如果未能解决你的问题,请参考以下文章

如何将一列的列值组合到 MySQL 中的另一列中?

以编程方式将多个 SQL 列组合并存储到一个列中

连接查询以获取多个数据到 laravel 中的数据表

将多个值添加到列中 - Pandas

MySQL数据库联合查询与连接查询

如何链接多个组合框表中的两个组合框?