将多个结果汇总到一个列中

4

我有两个表:

╔══════════════╦═════════════╗
║ Table: book  ║ Column info ║
╠══════════════╬═════════════╣
║ - id         ║ int, pk     ║
║ - title (128)║ varchar     ║
╚══════════════╩═════════════╝

╔══════════════╦═════════════╗
║Table: author ║ Column info ║
╠══════════════╬═════════════╣
║ - id         ║ int, pk     ║
║ - name (128) ║ varchar     ║
║ - bookId     ║ int, fk     ║
╚══════════════╩═════════════╝

(我知道这不是一个完全规范化的例子,但为了简单起见,我尽力了。)

从它们那里收集数据非常简单:

SELECT b.title, a.name FROM book b
INNER JOIN author a ON a.bookId = b.id
WHERE b.id = x

然而,这显然会得到每个作者一行的结果 - 这不是我想要的。 相反,我正在尝试实现这种数据结构:[String title, String[] authors(数组)]。 有没有可能在一个查询中实现这一点?最好不要将作者列合并为一个字符串。类似于列本身的内部数组。

1
你正在寻找 GROUP_CONCAT - Kermit
"内部数组"在什么上下文中?GROUP_CONCAT将生成一个包含连接值的字符串。您正在使用哪种编程语言,以及您打算如何操作 "内部数组"? - Jim Garrison
@njk 我相信它会将列合并成一个字符串?这并不是我要找的。 - Zar
@JimGarrison Java。我知道这可以很容易地通过一个查询完成,但这样做有什么乐趣呢? - Zar
@pst 是的,我也是这么想的。这将非常方便,因为它可以避免这样做:book = getBookData(id); book[authors] = getBookAuthors(id);(仅为示例)。 - Zar
3个回答

2
这个能否在一条查询中完成呢?最好不要将作者列“合并”成一个字符串,而是像列内部数组一样。 不行 :) GROUP_CONCAT等函数会产生标量(字符串)结果。在[标准] SQL中,没有“字符串数组”数据类型。
这是可以接受的,因为:
  1. 客户端程序可以自己对数据进行去规范化1以供进一步处理,或者
  2. 可以将去规范化的字符串发送到命令行/文本客户端进行数据可视化,或者
  3. 规范化形式适用于使用结果进行进一步查询2

1 创建一个数组以进行进一步处理通常在客户端完成,不同的语言有所不同 - 在C# / LINQ中只需要一行代码。

2 通过保持其规范化形式,可以应用进一步的关系代数操作/优化。过早地去规范化数据可能会消除广泛的有效(可能更高效)的查询计划。


1
你需要使用 group_concat:
select b.title,
       group_concat(a.name)
from book b join
     author a
     on b.id = a.bookid
group by b.id, b.title

这将所有作者放入一个用逗号分隔的列表中。您可以使用SEPARATOR语句指定分隔符。

请注意,我还按书籍ID分组,以防止两本书具有相同的标题。


0

试一下这个

 SELECT b.title,a.name, concat('[',b.title,',',a.name, ']') as output
 FROM book b 
 INNER JOIN author a
 ON b.id = a.bookid
 GROUP BY b.id, b.title

SQL演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接