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数组里,一旦答案本身包含逗号,这个结果就彻底失效了。
新方案的关键逻辑
JSON_QUOTE(Answers.answer):把每个答案转成符合JSON规范的字符串,自动处理字符串里的引号、逗号、换行等特殊字符,确保每个元素都是合法的JSON值。GROUP_CONCAT:把这些处理后的合法JSON字符串用逗号连接,得到类似"answer1","answer2","answer3"的片段。- 最后用
CONCAT给这个片段前后加上方括号,就生成了标准的JSON数组["answer1","answer2","answer3"]。
额外注意事项
如果你的答案数量很多,GROUP_CONCAT的结果可能会超过MySQL默认的group_concat_max_len限制(默认是1024字节),可以临时调整会话级别的参数来扩容:
SET SESSION group_concat_max_len = 1000000; -- 数值根据你的实际数据量调整
内容的提问来源于stack exchange,提问作者j10
相关产品推荐
相关产品推荐

