【发布时间】:2016-09-25 01:17:28
【问题描述】:
在 MySQL 5.7.12 版(手册中的第 13.16 节)中仅使用本机 JSON 函数(无 PHP 等)我正在尝试编写一个查询以从包含子对象的关系表生成 JSON 文档。举个例子:
CREATE TABLE `parent_table` (
`id` int(11) NOT NULL,
`desc` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `child_table` (
`id` int(11) NOT NULL,
`parent_id` int(11) NOT NULL,
`desc` varchar(20) NOT NULL,
PRIMARY KEY (`id`,`parent_id`)
);
insert `parent_table` values (1,'parent row 1');
insert `child_table` values (1,1,'child row 1');
insert `child_table` values (2,1,'child row 2');
我正在尝试生成一个如下所示的 JSON 文档:
[{
"id" : 1,
"desc" : "parent row 1",
"child_objects" : [{
"id" : 1,
"parent_id" : 1,
"desc" : "child row 1"
}, {
"id" : 2,
"parent_id" : 1,
"desc" : "child row 2"
}
]
}]
我是 MySQL 新手,我怀疑有一种 SQL 模式可用于从一对多关系生成嵌套 JSON 对象,但我找不到它。
在 Microsoft SQL(我更熟悉)中,以下工作:
select
[p].[id]
,[p].[desc]
,(select * from [dbo].[child_table] where [parent_id] = [p].[id] for json auto) AS [child_objects]
from [dbo].[parent_table] [p]
for json path
我尝试在 MySQL 中编写如下等效代码:
select json_object(
'id',p.id
,'desc',p.`desc`
,'child_objects',(select json_object('id',id,'parent_id',parent_id,'desc',`desc`)
from child_table where parent_id = p.id)
)
from parent_table p;
select json_object(
'id',p.id
,'desc',p.`desc`
,'child_objects',json_array((select json_object('id',id,'parent_id',parent_id,'desc',`desc`)
from child_table where parent_id = p.id))
)
from parent_table p
两次尝试都失败并出现以下错误:
Error Code: 1242. Subquery returns more than 1 row
【问题讨论】: