2020-10-10 10:34:26
在MySQL中,可以通过联合查询结合JSON函数来获取嵌套的JSON数据。以下是具体实现方法及说明:
方法一:使用 GROUP_CONCAT 拼接JSON字符串SELECT s.id, s.name, CONCAT( '[', GROUP_CONCAT( JSON_OBJECT('id', i.id, 'url', i.url) SEPARATOR ',' ), ']' ) AS imagesFROM student sLEFT JOIN images i ON s.id = i.l_idGROUP BY s.id, s.name;关键点说明:GROUP_CONCAT
将多行图片数据合并为一个字符串,通过 SEPARATOR ',' 分隔。
需手动添加方括号 [] 包裹结果,形成JSON数组格式。
JSON_OBJECT
将每张图片的 id 和 url 转换为JSON对象(如 {"id":1,"url":"image1.jpg"})。
潜在问题
若图片数据量过大,GROUP_CONCAT 结果可能被截断(受 group_concat_max_len 参数限制)。
原生JSON数组聚合
JSON_ARRAYAGG 直接生成合法的JSON数组,无需手动拼接字符串。
避免截断问题,性能更优。
结果示例
{ "id": 1, "name": "john doe", "images": [ {"id": 1, "url": "image1.jpg"}, {"id": 2, "url": "image2.jpg"} ]}若需进一步处理嵌套结构(如图片分组或过滤),可使用子查询:
SELECT s.id, s.name, ( SELECT JSON_ARRAYAGG( JSON_OBJECT('id', i.id, 'url', i.url) ) FROM images i WHERE i.l_id = s.id ) AS imagesFROM student s;性能优化建议索引优化
确保 images.l_id 和 student.id 有索引,加速JOIN操作。
分页处理
对大量数据分页查询,避免单次返回过多记录:SELECT ... FROM ... GROUP BY ... LIMIT 0, 10;
MySQL版本
优先使用 JSON_ARRAYAGG(MySQL 5.7+),兼容性和性能更佳。
通过以上方法,可以高效地在MySQL中实现嵌套JSON数据的联合查询。