当前位置: 首页 > 面试题库 >

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

许黎明
2023-03-14
问题内容

我有一个带有用于发布的表的数据库,每个表可以有多个作者,这些作者存储在不同的表中。我想查询数据库,以便在第一列中提供出版物标题列表,在第二列中提供该出版物的合并作者。

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

有什么线索吗?


问题答案:

您需要对SELECT中的所有非聚合列进行分组(并且明确地,不按作者ID分组,因为author是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`;


 类似资料:
  • 问题内容: 我有一个这样的熊猫数据框: 我现在想做的是获取一个包含Column1和新columnA的新数据框。此columnA应该包含第2列-(to)n的所有值(其中n是从Column2到行尾的列数),如下所示: 我如何最好地解决这个问题?任何意见将是有益的。提前致谢! 问题答案: 您可以按行调用pass ,然后将dtype转换为和: 在这里,我呼吁摆脱,但是我们需要再次强制转换为,这样我们才不会

  • 在我的自动化项目中,我有两个跑步者,如下所示: > 主运行程序-执行所有标记的测试用例,如果场景失败将填充场景位置(例如): 次要运行程序-从重新执行场景: 执行执行时,将创建两个结果json文件: Jenkins将通过插件收集结果,并创建一个组合报告。 问题是,即使在第二次运行中通过了所有测试,由于,报告状态仍将失败。 有没有一种方法(设置插件或修改上面显示的运行程序)用的结果覆盖,并且只发布修

  • 我有索引,其中每个文档都有这样的结构: 我需要计算每个演员对应的电影数量(演员可以在actor_1_name、actor_2_name或actor_3_name字段中) 这3个字段的映射是: 有没有一种方法,我可以聚合的结果,可以结合所有3个演员领域的条款,并给出一个单一的聚合。 目前,我正在为每个actor字段创建单独的聚合,并通过我的JAVA代码将这些不同的聚合合并成一个。 通过创建不同的聚合

  • 我看到的mysql表如下所示: 用户信息 id |用户id |电话号码|信息|方向|创建于 用户 id |名称 我想'组由'user_messages两次和UNION的结果。我为什么要这么做?因为user_id有时有一个有效的用户ID(不是'-1'),所以我按它分组,如果它有-1,则按phone_number分组。 我也想左加入结果与用户表以获得用户名的情况下user_id设置为一个有效的用户 我

  • 问题内容: 我的应用程序需要多个jar才能工作。由于它是桌面应用程序,因此我无法让用户负责安装。因此,在我的构建脚本中,我将jar内容解压缩到我的构建目录中,删除清单文件,编译我的软件,然后再次对其进行jar。一切正常,因为我的问题是此过程是否有长期副作用? 问题答案: 过去,JAR的内容很奇怪(例如包含和的DB2驱动程序;在Windows文件系统中解压缩后,这两个软件包将合并在一起)。 您需要了

  • 问题内容: 情况: 用户想使用Youtube的JSON API在JQuery网站中导入Youtube播放列表。 问题: Youtube仅返回前50个条目,但是播放列表的长度可能超过100个条目(长度由JSON响应中的“ totalItems”给出)。所有条目都需要合并为1个对象,最后需要将其推入到输出函数中。 条目1-50:http : //gdata.youtube.com/feeds/api/