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

低版本MySQL/phpMyAdmin不支持FOR JSON,联表查询如何输出子表JSON结果

MySQL查询结果拼接JSON字段实现方案

FOR JSON PATH、FOR JSON AUTO是SQL Server专属语法,MySQL本身从未支持过该写法,不是版本低导致的报错。如果需要在查询Table1时将Table2的结果封装为JSON字符串返回,可根据实际MySQL版本选择以下方案:

方案1:MySQL 5.7及以上版本(支持原生JSON函数)

使用MySQL内置的JSON构造、聚合函数实现,输出的是标准合法JSON格式,不需要手动处理转义:

SELECT 
  t1.id,
  t1.col1,
  t1.col2,
  (
    SELECT JSON_ARRAYAGG(JSON_OBJECT('id', t2.id, 'attr', t2.attr))
    FROM Table2 t2
    -- 如果需要两表按id关联匹配,取消下面语句的注释即可
    -- WHERE t2.id = t1.id
  ) AS table2_json
FROM Table1 t1;
  • JSON_OBJECT:将单条Table2记录转换为JSON对象
  • JSON_ARRAYAGG:将多条JSON对象聚合为JSON数组

方案2:MySQL 5.6及以下低版本(无原生JSON函数)

通过字符串函数手动拼接JSON结构,需要自行处理特殊字符转义避免格式错误:

SELECT 
  t1.id,
  t1.col1,
  t1.col2,
  (
    SELECT CONCAT(
      '[',
      GROUP_CONCAT(
        CONCAT(
          '{"id":', t2.id,
          ',"attr":"', REPLACE(t2.attr, '"', '\\"'), '"}'
        ) SEPARATOR ','
      ),
      ']'
    )
    FROM Table2 t2
    -- 如果需要两表按id关联匹配,取消下面语句的注释即可
    -- WHERE t2.id = t1.id
  ) AS table2_json
FROM Table1 t1;

注意:MySQL默认GROUP_CONCAT最大长度为1024字节,如果Table2数据量较大,需要先调大group_concat_max_len参数,否则拼接结果会被截断。

方案3:业务层处理(兼容性最优)

如果数据库版本过低、不方便调整数据库参数,可以拆分查询逻辑在业务代码层实现:

  • 先执行SQL查询Table1拿到所有主表数据
  • 再执行SQL查询Table2拿到所需的从表数据
  • 在PHP/Java等业务代码中,将Table2的结果序列化为JSON格式,再和Table1的数据按关联字段匹配即可
    该方案完全不受数据库版本、函数限制,也不需要手动处理JSON转义逻辑,出错概率更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.07 16:15:41