如何使用 MySQL 联合查询获取嵌套 JSON 数据?

如何使用 MySQL 联合查询获取嵌套 JSON 数据?
最新回答
派大星┘

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;关键点说明
  1. GROUP_CONCAT

    将多行图片数据合并为一个字符串,通过 SEPARATOR ',' 分隔。

    需手动添加方括号 [] 包裹结果,形成JSON数组格式。

  2. JSON_OBJECT

    将每张图片的 id 和 url 转换为JSON对象(如 {"id":1,"url":"image1.jpg"})。

  3. 潜在问题

    若图片数据量过大,GROUP_CONCAT 结果可能被截断(受 group_concat_max_len 参数限制)。

方法二:使用 JSON_ARRAYAGG(推荐,MySQL 5.7+)SELECT s.id, s.name, JSON_ARRAYAGG( JSON_OBJECT('id', i.id, 'url', i.url) ) AS imagesFROM student sLEFT JOIN images i ON s.id = i.l_idGROUP BY s.id, s.name;优势说明
  1. 原生JSON数组聚合

    JSON_ARRAYAGG 直接生成合法的JSON数组,无需手动拼接字符串。

    避免截断问题,性能更优。

  2. 结果示例

    { "id": 1, "name": "john doe", "images": [ {"id": 1, "url": "image1.jpg"}, {"id": 2, "url": "image2.jpg"} ]}
方法三:子查询 + JSON聚合(适用于复杂场景)

若需进一步处理嵌套结构(如图片分组或过滤),可使用子查询:

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;性能优化建议
  1. 索引优化

    确保 images.l_id 和 student.id 有索引,加速JOIN操作。

  2. 分页处理

    对大量数据分页查询,避免单次返回过多记录:SELECT ... FROM ... GROUP BY ... LIMIT 0, 10;

  3. MySQL版本

    优先使用 JSON_ARRAYAGG(MySQL 5.7+),兼容性和性能更佳。

总结
  • 简单场景:用 GROUP_CONCAT + 手动拼接JSON(需注意截断)。
  • 推荐方案:使用 JSON_ARRAYAGG 直接生成JSON数组,简洁高效。
  • 复杂逻辑:结合子查询灵活处理嵌套结构。

通过以上方法,可以高效地在MySQL中实现嵌套JSON数据的联合查询。