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

然而,这显然会为每个作者产生一行——这不是我想要的。相反,我正在尝试实现这个数据结构:

[字符串标题,字符串[]作者(数组)]

是否可以在一个查询中执行此操作?最好不要将作者列“合并”成一个字符串。类似于列本身的内部数组。

4

3 回答 3

2

是否可以在一个查询中执行此操作?最好不要将作者列“合并”成一个字符串。类似于列本身的内部数组。

不 :)

GROUP_CONCAT 和类似的产生一个标量(字符串)结果。[标准] SQL中没有“字符串数组”数据类型。

这是“好的”,因为

  1. 客户端程序可以对数据本身进行反规范化1以进行进一步处理,或者
  2. 可以将非规范化字符串发送到命令行/文本客户端以进行数据可视化,或者
  3. 规范化的形式是使用结果与进一步查询2所需要的。

1创建一个数组以进行进一步处理通常在客户端上完成,并且因语言而异 - 它是 C#/LINQ 中的一个微不足道的单行代码。

2通过将其保留为规范化形式,可以应用进一步的关系代数运算/优化。尽早对数据进行反规范化可以消除大量有效(并且可能更有效)的查询计划。

于 2013-01-28T19:46:47.263 回答
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 分组,以防两本书具有相同的标题。

于 2013-01-28T19:41:25.717 回答
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 演示

于 2013-01-28T19:45:04.797 回答