在一列中收集多个结果

时间:2013-01-28 19:39:21

标签: mysql sql database

我有两张桌子:

╔══════════════╦═════════════╗
║ 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(array)]

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

3 个答案:

答案 0 :(得分:2)

  

是否可以在一个查询中执行此操作?优选地,不将作者列“合并”为单个字符串。类似于列本身的内部数组。

否:)

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

这是“确定”,因为

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

  4. 1 创建一个数组以供进一步处理通常在客户端上完成,并且因语言而异 - 它在C#/ LINQ中是一个简单的单行程序。

    2 通过将其保留为标准化形式,可以应用进一步的Relational Algebra操作/优化。尽早去标准化数据可以消除各种有效(可能更有效)的查询计划。

答案 1 :(得分: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分组,以防两本书具有相同的标题。

答案 2 :(得分: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 DEMO