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

MySQL如何将多行JSON对象合并转换为JSON数组?

多行JSON对象转标准JSON数组实现方案

方案一:原生JSON聚合函数实现(优先推荐)

如果你的数据库是MySQL 5.7.22及以上版本,直接使用内置的JSON_ARRAYAGG()聚合函数即可,该函数会自动将多行JSON对象合并为合法的JSON数组,自动处理分隔符、格式转义,不需要手动拼接字符串,出错概率极低。
修正后的可直接运行SQL如下:

SELECT JSON_ARRAYAGG(
    JSON_OBJECT('uniqueId', uniqueId, 'name', name)
) AS actors
FROM (
    SELECT af.id as uniqueId, al.skill_type_name as name
    FROM actor_family af
    INNER JOIN actor_layered al 
    ON af.id = al.actor_family_id
) AS actor_source;

提示:如果你需要按某个维度分组生成多个数组,只需要在最后加上对应GROUP BY字段即可;如果需要全量数据合并为单个数组,不需要加GROUP BY。

额外修正:你原有SQL存在两处语法问题:一是子查询表别名定义为af/al,SELECT字段时却用了未定义的stf/stl别名;二是子查询输出字段别名为familyId,外层却引用uniqueId字段,上述SQL已经同步修正这两处问题,你可以根据实际表结构调整字段映射。


方案二:低版本兼容:GROUP_CONCAT手动拼接

如果你的数据库版本较低不支持JSON_ARRAYAGG,可以用GROUP_CONCAT实现,要注意三个容易出错的点:

  • 拼接结果必须手动包裹[和]才能构成合法数组
  • 提前调整group_concat_max_len参数,避免数据量大时结果被截断
  • 直接拼接JSON_OBJECT输出结果,不要额外加转义或多余引号

对应SQL如下:

-- 先调大GROUP_CONCAT允许的最大长度,避免结果截断,根据实际数据量调整数值即可
SET SESSION group_concat_max_len = 1024000;

SELECT CONCAT(
    '[',
    GROUP_CONCAT(
        JSON_OBJECT('uniqueId', uniqueId, 'name', name)
        SEPARATOR ','
    ),
    ']'
) AS actors
FROM (
    SELECT af.id as uniqueId, al.skill_type_name as name
    FROM actor_family af
    INNER JOIN actor_layered al 
    ON af.id = al.actor_family_id
) AS actor_source;

之前使用GROUP_CONCAT失败的常见原因

  • 没有手动包裹数组的中括号,仅得到逗号分隔的JSON对象串,不符合数组格式
  • 拼接时额外添加了引号、转义符,导致JSON格式非法
  • 未调整GROUP_CONCAT长度阈值,长内容被截断,生成损坏的JSON
  • 子查询字段别名和外层引用不匹配,生成的JSON内容不符合预期

内容的提问来源于stack exchange,提问作者Aԃιƚყα Gυɾαʋ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:30:57