低版本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
相关产品推荐
相关产品推荐

