【问题标题】:Sort by JSON field values按 JSON 字段值排序
【发布时间】:2026-01-10 08:20:06
【问题描述】:

我有一个这样的 json 值的表:

-表1

id    |   name   |   data
------+----------+---------------
1     | Test     | {"city_id": 3, "email":"test@test.com", "city_name":"something"}
2     | Test 2   | {"city_id": 1, "email":"test2@test2.com", "city_name":"another"}
3     | Test 3   | {"city_id": 6, "email":"test3@test3.com", "city_name":"blahblah"}

现在我想要SELECTorder by data.city_name 的记录,所以我使用这个代码:

SELECT id, name, JSON_EXTRACT(data, 'city_name') AS cityName
FROM table1
ORDER BY cityName ASC

但此查询无法正确排序我的记录!

P.S:city_name 有 UTF-8 字符。

【问题讨论】:

  • 你能告诉我们实际数据、错误输出和预期输出吗?
  • try as :: SELECT ... JSON_EXTRACT(data, '$.city_name') AS cityName...
  • MySQL 使用 utf8mb4_bin 排序规则处理 JSON 上下文中使用的字符串,因此区分重音和大小写。

标签: mysql json


【解决方案1】:

我认为最简单的方法

SELECT * FROM YourTable order by data->"$.city_name" desc

【讨论】:

    【解决方案2】:

    我通常将cast JSON 值 (->>) 转换为正确的类型以便正确排序:

    SELECT id, name, data->>'$.city_name' AS cityName
    FROM table1
    ORDER BY CAST(cityName AS CHAR) ASC
    

    否则,您最终会以 blob(二进制)进行排序,将其视为二进制字符串(字节字符串),因此它们具有二进制字符集和排序规则,并且比较和排序基于字节的数值在列值中 (ref)。

    【讨论】:

      【解决方案3】:

      您似乎没有正确使用JSON_EXTRACT(),请尝试:

      SELECT id, name, JSON_EXTRACT(data, '$.city_name') AS cityName 
      FROM demo ORDER BY cityName ASC
      

      Demo Fiddle

      【讨论】:

        【解决方案4】:

        检查一下。

        SELECT Id ,name,SUBSTRING_INDEX(SUBSTRING_INDEX(data,'city_name":"',-1),'"',1) as CITY
        FROM tempjson
        order by SUBSTRING_INDEX(SUBSTRING_INDEX(data,'city_name":"',-1),'"',1)
        

        输出:

        【讨论】: