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

MySQL 8.4中如何按原JSON数组顺序排序聚合结果?

问题:查询时保持JSON数组关联数据的原顺序

表结构

  • media表:

    media_idmedia_urletc.
    3image3.jpg...
    6image6.jpg...
    1image1.jpg...
  • products表:

    product_idproduct_titleproduct_media_idsetc.
    ......[3,6,1]...

product_media_ids是存储ID数组的JSON字段,需求是查询时获取与该数组顺序完全一致的media_url数组(示例期望结果:['image3.jpg', 'image6.jpg', 'image1.jpg'])。

现有查询能获取关联数据,但无法保留原数组顺序:

SELECT
P.*,
  (SELECT JSON_ARRAYAGG(JSON_OBJECT('id', M2.media_id, 'url', M2.media_url))
  FROM media AS M2
  WHERE JSON_CONTAINS(P.product_media_ids, CAST(M2.media_id AS JSON), '$')
  ) AS image_array
FROM products AS P;

解决方案(MySQL 8.4.4适用)

利用JSON_TABLE将JSON数组拆分为带原始索引位置的行数据,关联media表后按索引排序再聚合,即可保留原顺序:

SELECT
  P.*,
  (SELECT JSON_ARRAYAGG(JSON_OBJECT('id', M.media_id, 'url', M.media_url))
   FROM JSON_TABLE(
     P.product_media_ids,
     '$[*]' COLUMNS(
       idx FOR ORDINALITY,
       media_id INT PATH '$'
     )
   ) AS JM
   JOIN media M ON JM.media_id = M.media_id
   ORDER BY JM.idx
  ) AS image_array
FROM products AS P;

核心逻辑说明

  • FOR ORDINALITY会生成数组元素的原始位置索引(从1开始),这是维持顺序的关键。
  • 按索引排序后再用JSON_ARRAYAGG聚合,最终生成的JSON数组顺序将与product_media_ids完全一致。
  • 写法简洁,适配MySQL 8.0及以上版本,完全匹配需求。

内容的提问来源于stack exchange,提问作者Ben in CA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:52:03