Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用mysql原生json函数生成嵌套json对象?_Mysql_Json - Fatal编程技术网

如何使用mysql原生json函数生成嵌套json对象?

如何使用mysql原生json函数生成嵌套json对象?,mysql,json,Mysql,Json,在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

在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

出现这些错误的原因是父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
    }]  
}'

对于MariaDb,强制转换为JSON不起作用。但JSON_EXTRACT可用于将字符串转换为JSON对象:

select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',JSON_EXTRACT(IFNULL((select
    CONCAT('[',GROUP_CONCAT(
      json_object('id',id,'parent_id',parent_id,'desc',`desc`)
    ),']')   
   from child_table where parent_id = p.id),'[]'),'$')
 ) from parent_table p;

您好,我无法使用json_对象这个函数#1305-函数json_对象不存在。怎么办???检查您使用的是哪个版本的Mysql。旧版本不支持json_object当前版本是5.6JSON聚合函数
json_ARRAYAGG()
json_OBJECTAGG()
现在在MySQL 8中可用。这可以正常工作,但仅适用于两个级别,我们可以达到“n”级别吗