首页 >数据库 >mysql教程 >如何从 MySQL 中的一对多关系生成嵌套 JSON 对象?

如何从 MySQL 中的一对多关系生成嵌套 JSON 对象?

Barbara Streisand
Barbara Streisand原创
2024-12-13 07:59:10122浏览

How to Generate Nested JSON Objects from One-to-Many Relationships in MySQL?

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

本文演示了如何利用 MySQL 版本 5.7.12 的原生 JSON 函数来构造嵌套JSON 文档表示关系中的一对多关系data.

问题陈述

给定两个表,parent_table 和 child_table,表示父子关系,目标是生成具有以下内容的 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"
            }
        ]
    }
]

解决方案

最初,尝试使用简单嵌套子查询创建嵌套 JSON 对象会导致错误,因为 MySQL 期望父级中存在简单对象对JSON 对象。为了解决这个问题,我们利用 GROUP_CONCAT 函数将多个子查询结果连接成一个字符串,然后将该结果转换为 JSON 数组。

但是,由于子查询的处理方式,结果 JSON 输出包含转义字符一个字符串。为了解决这个问题,我们使用 CAST 和 CONCAT 函数直接在子查询中创建 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
    }]  
}'

以上是如何从 MySQL 中的一对多关系生成嵌套 JSON 对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn