首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:将联接后的多个值合并为一个结果列

MySQL:将联接后的多个值合并为一个结果列
EN

Stack Overflow用户
提问于 2014-02-04 21:22:17
回答 2查看 9.2K关注 0票数 11

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

代码语言:javascript
复制
SELECT p.`id`, p.`title`, a.`fullname` 
from `publications` p 
LEFT JOIN `authors` a on a.`publication_id` = p.`id`;

当然,这给了我数倍于许多作者的出版物标题。

代码语言:javascript
复制
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分组,每个标题有一个作者:

代码语言:javascript
复制
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

我想要的结果是:

代码语言:javascript
复制
id   title              fullname
--   -----              --------
1    Beneath the Skin   Sean French, Nicci Gerrard
2    The Talisman       Stephen King, Peter Straub

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

代码语言:javascript
复制
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会给我一个“每个派生表必须有自己的别名”的错误。

代码语言:javascript
复制
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`;

有什么线索吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-04 21:24:07

您需要按SELECT中的所有非聚集列进行分组(显式地,不要按author id分组,因为author是GROUP_CONCAT的一部分):

代码语言:javascript
复制
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`;
票数 15
EN

Stack Overflow用户

发布于 2014-02-04 21:39:00

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

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21553721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档