MySQL查询按JSON列中的值排序

时间:2013-12-17 21:31:31

标签: php mysql sql json

如何根据表格中字段中的平均Rating对查询进行排序,字段本身为JSON文本,结构如下:

[
 {"Type":1,"Rating":5},
 {"Type":2,"Rating":5},
 {"Type":3,"Rating":5}
]

我需要按3 Rating的平均值对我的查询进行排序。总是只有3个值。

我目前的查询是:

SELECT `Name`, `Town`, `Vehicle`, `Review`, `Rating`, `Pics`, `PostedOn` 
FROM `tbl_ShopReviews`
WHERE `Approved` = 1
ORDER BY `PostedOn` DESC

目前的结果:

Name    Town    Vehicle Review  Rating  Pics    PostedOn
Kevin   Chicopee    94 Corolla  Great stuff, very glad I brought it here    [{"Type":1,"Rating":5},{"Type":2,"Rating":5},{"Type":3,"Rating":5}]     \N

6 个答案:

答案 0 :(得分:2)

例如0的值类似于

field_name

使用此代码在ORDER BY case中获取基于json字段{"json_field_key1":"2016/11/24","json_field_key2":"value"}的值

json_field_key1

如果您的值是日期格式,只需修改此代码,如

select table.*, SUBSTRING_INDEX(SUBSTRING_INDEX(field_name,'json_field_key1":"',-1),'"',1) as json_field_name from table ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(field_name,'json_field_key1":"',-1),'"',1) DESC

答案 1 :(得分:1)

答案 2 :(得分:0)

更好的解决方案是在插入之前解析数据,并在3列或1标准化列中为您准备好。 说,如果你正在处理一个不可改变的情况,并且总是有3个评级,你可以试试这个

ORDER BY (substring(json, 21, 1)+
substring(json, 43, 1)+
substring(json,65, 1))/3 desc;

请考虑这个解决方案是最不易维护和灵活的,并且非常容易出错。真正的解决方案是重组您的数据。

答案 3 :(得分:0)

在我看来,最好的解决方案是能够在应用程序中为该评论表连接更新和插入事件,并计算到另一个字段的平均值。

然后,那些需要此信息的查询将更容易处理并具有更好的性能。

答案 4 :(得分:-1)

没有一种简单的方法可以做到这一点,事实上,我甚至不确定它是否可能。

话虽这么说,你的数据库结构真的不应该包含JSON,如果它是你需要访问的东西,而不是为什么不在你的数据库中添加一个Type字段呢?

答案 5 :(得分:-1)

Rating字段可以是一个表,其中user,type和vlaue为用户为键的列。然后你可以在键匹配的值列上使用mysql AVG(),然后对其进行排序。

希望这个帮助