我有两张桌子:
╔══════════════╦═════════════╗
║ 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)]
是否可以在一个查询中执行此操作?最好不要将作者列“合并”为一个单独的字符串。类似于列本身的内部数组。
答案 0 :(得分:2)
是否可以在一个查询中执行此操作?优选地,不将作者列“合并”为单个字符串。类似于列本身的内部数组。
否:)
GROUP_CONCAT和类似产生标量(String)结果。 [标准] SQL中有 no “数组字符串”数据类型。
这是“确定”,因为
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