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

MySQL中JSON类型字段存储的键值对如何按值排序查询

MySQL JSON字段值排序解决方案

问题核心原因

你之前的写法不生效是两个核心原因:

  • json -> '$.*'返回的是JSON中按键顺序排列的所有值组成的数组,本身不会调整内部元素顺序
  • ORDER BY作用是对查询返回的行进行排序,不是对单行内的数组元素排序,CAST转换整个数组为无符号的逻辑完全不生效

实现方案(MySQL 8.0+ 支持)

核心思路是先把JSON对象的键值对拆分为独立的行,按值排序后再聚合为你需要的JSON格式。

1. 拆解为排序后的键值行

SELECT j.`key`, j.`value`
FROM 你的表名 t,
JSON_TABLE(
  JSON_KEYS(t.你的JSON字段名),
  '$[*]' COLUMNS (
    `key` VARCHAR(255) PATH '$',
    `value` INT PATH CONCAT('$.', `key`)
  )
) j
-- 此处添加你筛选行的条件,例如 WHERE t.id = xxx
ORDER BY j.`value` DESC;

2. 聚合为排序后的JSON对象

如果需要直接返回排序完成的JSON结构,在外层加聚合逻辑即可:

SELECT JSON_OBJECTAGG(j.`key`, j.`value`) AS sorted_json
FROM (
  SELECT j.`key`, j.`value`
  FROM 你的表名 t,
  JSON_TABLE(
    JSON_KEYS(t.你的JSON字段名),
    '$[*]' COLUMNS (
      `key` VARCHAR(255) PATH '$',
      `value` INT PATH CONCAT('$.', `key`)
    )
  ) j
  -- 筛选条件
  WHERE t.id = 1
  -- 值相同可额外指定按键排序
  ORDER BY j.`value` DESC, j.`key`
) AS sorted_kv;

返回结果示例:
{"870013663581437952": 6, "903739315782320168": 3, "574161434674462720": 1, "913739315950071829": 1}

低版本MySQL兼容说明

MySQL 5.7及以下版本不支持JSON_TABLE函数,要实现该需求需要借助数字辅助表遍历JSON键,实现复杂度较高,建议升级到MySQL 8.0以上版本使用上述方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:48:00