首页 > 数据库 > mysql教程 > 如何使用 JSON_OBJECT 和 JSON_ARRAY 从 MySQL 关系数据生成嵌套 JSON 对象?

如何使用 JSON_OBJECT 和 JSON_ARRAY 从 MySQL 关系数据生成嵌套 JSON 对象?

Linda Hamilton
发布: 2024-11-29 06:41:10
原创
578 人浏览过

How to Generate Nested JSON Objects from MySQL Relational Data Using JSON_OBJECT and JSON_ARRAY?

使用 MySQL 原生 JSON 函数生成嵌套 JSON 对象

MySQL 版本 5.7.12 引入了原生 JSON 函数,可以直接从关系数据创建 JSON 文档。为了实现这一目标,可以利用 JSON_OBJECT() 和 JSON_ARRAY() 函数。

考虑提供的示例表:

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`)
);
登录后复制

目标是生成包含嵌套对象的 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"
        }
    ]
}]
登录后复制

解决错误

之前的尝试遇到了错误“子查询返回超过 1 行”,因为 JSON 对象需要简单的键值对作为输入。返回多行的子查询需要转换为单个字符串或 JSON 数组。

解决方案

要克服此错误,可以使用 MySQL 的 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;
登录后复制

为了消除输出中的转义字符,查询被修改为使用 CAST() 和 CONCAT() 函数:

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;
登录后复制

此改进的查询生成所需的 JSON 输出:

'{\"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_OBJECT 和 JSON_ARRAY 从 MySQL 关系数据生成嵌套 JSON 对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板