You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从SQL表输出无重复层级JSON数组的最佳实践是什么?

扁平化关系表生成嵌套JSON的实现方案

核心逻辑

要避免重复的Container、Material节点,必须采用从内到外分层聚合的思路:先聚合最细粒度的Size列表,再向上聚合Material列表,最后聚合Container列表,每一层基于父级ID分组,天然保证父节点ID唯一,不需要额外去重。

数据库端直接生成(推荐,性能最优)

MySQL 8.0+ 示例

把your_table_name替换为你的实际表名即可:

SELECT JSON_OBJECT(
    'container', JSON_ARRAYAGG(
        JSON_OBJECT(
            'id', ContainerId,
            'material', material_list
        )
    )
) AS final_json
FROM (
    -- 第二层:按Container分组,聚合所属的所有Material
    SELECT 
        ContainerId,
        JSON_ARRAYAGG(
            JSON_OBJECT(
                'id', MaterialId,
                'size', size_list
            )
        ) AS material_list
    FROM (
        -- 第一层:按Container+Material分组,聚合所属的所有Size
        SELECT 
            ContainerId,
            MaterialId,
            JSON_ARRAYAGG(JSON_OBJECT('id', SizeId)) AS size_list
        FROM your_table_name
        GROUP BY ContainerId, MaterialId
    ) t1
    GROUP BY ContainerId
) t2;

PostgreSQL 示例

SELECT jsonb_build_object(
    'container', jsonb_agg(
        jsonb_build_object(
            'id', "ContainerId",
            'material', material_list
        )
    )
) AS final_json
FROM (
    SELECT 
        "ContainerId",
        jsonb_agg(
            jsonb_build_object(
                'id', "MaterialId",
                'size', size_list
            )
        ) AS material_list
    FROM (
        SELECT 
            "ContainerId",
            "MaterialId",
            jsonb_agg(jsonb_build_object('id', "SizeId")) AS size_list
        FROM your_table_name
        GROUP BY "ContainerId", "MaterialId"
    ) t1
    GROUP BY "ContainerId"
) t2;

应用代码端生成(适合多数据源聚合场景)

以Python为例,逻辑和数据库分层聚合一致,用字典做天然去重:

import json
from collections import defaultdict

# 模拟从数据库查询返回的原始数据
db_rows = [
    (848, 1, 1, 1), (849, 1, 1, 2), (850, 1, 2, 1), (851, 1, 2, 2),
    (852, 1, 3, 1), (853, 1, 4, 1), (854, 2, 2, 1), (855, 2, 2, 2), (856, 2, 2, 3)
]

# 分层存储,天然去重外层ID
container_map = defaultdict(lambda: defaultdict(list))
for row in db_rows:
    cid, mid, sid = row[1], row[2], row[3]
    container_map[cid][mid].append(sid)

# 组装目标结构
output = {"container": []}
for cid, mat_map in container_map.items():
    mat_list = []
    for mid, size_ids in mat_map.items():
        mat_list.append({
            "id": mid,
            "size": [{"id": sid} for sid in size_ids]
        })
    output["container"].append({
        "id": cid,
        "material": mat_list
    })

# 输出格式化JSON
print(json.dumps(output, indent=2, ensure_ascii=False))

内容的提问来源于stack exchange,提问作者Coilover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:36:07