如何将MySQL关联表的多行数据转换为单个数组列?
优化MySQL一对多关联查询的数组结果获取方案
核心解决方案(MySQL 5.7.22+)
使用MySQL原生的**JSON_ARRAYAGG()**聚合函数,它专门用于将分组内的字段值聚合为JSON数组,完美匹配你的需求:
假设表结构:
country:id(主键)、nameuser:id、name、country_id(关联country.id)
查询SQL:
SELECT c.id AS country_id, c.name AS country_name, JSON_ARRAYAGG(u.name) AS user_list FROM country c LEFT JOIN user u ON c.id = u.country_id GROUP BY c.id, c.name;
返回的user_list字段直接是标准JSON数组格式(如["Alice","Bob"]),PHP端只需调用json_decode($row['user_list'], true)即可得到PHP数组,无需手动拆分分隔符。
兼容低版本MySQL方案(5.7.22以下)
如果无法升级MySQL,可通过GROUP_CONCAT配合字符串拼接生成合法JSON数组,同时用QUOTE()处理特殊字符避免格式错误:
SELECT c.id AS country_id, c.name AS country_name, CONCAT('[', GROUP_CONCAT(QUOTE(u.name)), ']') AS user_list FROM country c LEFT JOIN user u ON c.id = u.country_id GROUP BY c.id, c.name;
方案对比
- JSON_ARRAYAGG:原生支持,自动处理特殊字符,性能更优,是首选方案
- GROUP_CONCAT+CONCAT:兼容旧版本,需手动处理JSON格式,注意
group_concat_max_len配置限制(避免过长内容被截断)
内容的提问来源于stack exchange,提问作者Jeú Casulo
相关产品推荐
相关产品推荐

