Mysql 按JSON字段值排序

Mysql 按JSON字段值排序,mysql,json,Mysql,Json,我有一个包含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"

我有一个包含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"}
现在,我需要
选择
记录,并按
顺序
数据。城市名称
,因此我使用以下代码:

SELECT id, name, JSON_EXTRACT(data, 'city_name') AS cityName
FROM table1
ORDER BY cityName ASC
但此查询无法正确排序我的记录

注意:
city\u name
有UTF-8字符。

检查此项

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)
输出:


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

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

为了正确排序,我通常将JSON值()转换为正确的类型:

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

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

您能给我们显示实际数据、错误输出和预期输出吗?请尝试as::SELECT。。。JSON_EXTRACT(数据,$.city_name')作为cityName…MySQL使用utf8mb4_bin排序规则处理JSON上下文中使用的字符串,因此重音和大小写是敏感的。工作非常完美。