开发者社区> 问答> 正文

如何使用mysql本地json函数生成嵌套的json对象??mysql

我试图在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

展开
收起
保持可爱mmm 2020-05-17 14:04:20 1183 0
1 条回答
写回答
取消 提交回答
  • 出现这些错误的原因是父json对象不希望将结果集作为其输入之一,因此您需要具有简单的对象对,例如{name,string}等错误报告-将来的功能中可能会提供 .. 。这只是意味着您需要将多行结果转换为用逗号分隔的结果隐式形式,然后转换为json数组。

    您的第二个示例几乎可以理解。

    您可以使用GROUP_CONCAT函数来实现自己的目标

    select json_object( 'id',p.id ,'desc',p.desc ,'child_objects',json_array( (select GROUP_CONCAT( json_object('id',id,'parent_id',parent_id,'desc',desc) )
    from child_table where parent_id = p.id)) ) from parent_table p; 这几乎可以正常工作,最终将子查询视为一个字符串,从而在其中保留了转义字符。

    '{"id": 1, "desc": "parent row 1", "child_objects": [" {\"id\": 1, \"desc\": \"child row 1\", \"parent_id\": 1 }, {\"id\": 2, \"desc\": \"child row 2\", \"parent_id\": 1}" ] }' 为了使它以适当的格式工作,您需要更改创建JSON输出的方式,如下所示:

    select json_object( 'id',p.id ,'desc',p.desc ,'child_objects',(select CAST(CONCAT('[', GROUP_CONCAT( JSON_OBJECT( 'id',id,'parent_id',parent_id,'desc',desc)), ']') AS JSON) from child_table where parent_id = p.id)

    ) from parent_table p; 这将为您提供所需的确切结果:

    '{"id": 1, "desc": "parent row 1", "child_objects": [{"id": 1, "desc": "child row 1", "parent_id": 1 }, {"id": 2, "desc": "child row 2", "parent_id": 1 }]
    }'来源:stack overflow

    2020-05-17 14:08:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像