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

MySQL 5.7.19如何将关联表答案聚合为单个JSON数组

在MySQL 5.7.19这个版本里,因为还没引入JSON_ARRAYAGG(这个函数要到5.7.22才会添加),所以得用手动拼接的方式来生成符合要求的JSON数组,还能完美解决答案含逗号的问题。

直接上可行的查询语句:

SELECT 
    Answers.question_Id AS questionId,
    CONCAT('[', GROUP_CONCAT(JSON_QUOTE(Answers.answer)), ']') AS answers
FROM Question
INNER JOIN Answers ON Question.id = Answers.question_Id
GROUP BY questionId;

为什么之前的两种尝试都不对?

  • 第一种group_concat(json_array(Answers.answer)):是把每个答案单独包装成一个JSON数组,再把这些独立数组用逗号连起来,所以得到的是多个数组的拼接结果,不是一个完整的JSON数组。
  • 第二种json_array(group_concat(Answers.answer)):先把所有答案用逗号拼成一个大字符串,再把这个字符串作为单个元素塞进JSON数组里,一旦答案本身包含逗号,这个结果就彻底失效了。

新方案的关键逻辑

  1. JSON_QUOTE(Answers.answer):把每个答案转成符合JSON规范的字符串,自动处理字符串里的引号、逗号、换行等特殊字符,确保每个元素都是合法的JSON值。
  2. GROUP_CONCAT:把这些处理后的合法JSON字符串用逗号连接,得到类似"answer1","answer2","answer3"的片段。
  3. 最后用CONCAT给这个片段前后加上方括号,就生成了标准的JSON数组["answer1","answer2","answer3"]。

额外注意事项

如果你的答案数量很多,GROUP_CONCAT的结果可能会超过MySQL默认的group_concat_max_len限制(默认是1024字节),可以临时调整会话级别的参数来扩容:

SET SESSION group_concat_max_len = 1000000; -- 数值根据你的实际数据量调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:48:07