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
相关产品推荐
相关产品推荐

