2013-12-17 52 views
1

我如何排序基於在一個領域的平均Rating在我的表的查詢,該領域本身是JSON文本,結構類似:MySQL查詢訂單的價值由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 
+2

把json放在這樣的表格裏從來都不是個好主意。有另一列評級和放在那裏收視率 –

+0

請注意我有3種不同的評級類型...我應該有另一列,然後創建3個記錄,每種類型1。因爲所有3種類型都是必需的 – Kevin

+0

您應該有一個評分表並使用外鍵來引用此表。閱讀更多關於規範化 –

回答

0

更好的解決方案是在插入之前,解析數據,並將其在3列或1列歸爲你準備好。 話說,如果你正在處理一個不可更改的情況,並有確切3個收視率始終,你可以試試這個

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

請考慮這個解決方案是最易於維護和靈活的他們全部,和非常容易出錯。真正的解決方案是重構您的數據。

+0

我正在處理一個不可改變的數據結構......並且是......總會有b 3個評級類型。我會在一段時間嘗試 – Kevin

-1

沒有一個簡單的方法來做到這一點,事實上,我什至不知道這是可能的。

這就是說,你的數據庫結構真的不應該包含JSON,如果它是你需要訪問的這方面的東西,相反,爲什麼不添加一個Type字段到你的數據庫?

+0

請注意,我有3種不同的評分類型...我應該有另一列,然後創建3條記錄,1爲每種類型。因爲所有3種類型都是必需的 – Kevin

+0

如果你有三種類型,那麼是的,你應該在數據庫中有一個字段來反映這一點,你是否將它抽象到另一個表完全取決於你,但你根本無法按內容排序一個json字符串,你也不應該這樣做,投票不會改變這個事實。 – ollieread

+0

我想我應該在q中表明是的...如果我有選擇調整數據庫的結構,那麼是的...這將是一種可能性...也許我需要停止假設其他人會在這裏永遠只是假定每個人都是一個小白鼠... ... downvote是非常合適的,因爲它對手頭問題的背景沒有建設性......也許你應該退後一步,處理這個問題本身,而不是簡單地陳述你的年輕人意見...不是說你的意見是壞的...它不處理手頭的問題,然而 – Kevin

-1

評分字段可以是用戶,表格和vlaue作爲列的列表,其中用戶是關鍵字。然後,您可以在密鑰匹配的值列上使用mysql AVG(),然後對其進行排序。

希望這有助於

0

在我看來,最好的解決方案是能夠掛鉤更新並在您的應用程序中爲該評論表插入事件,並計算其他字段的平均值。

然後那些需要這些信息的查詢將更容易處理,並且會有更好的性能。

1

例如field_name有一個像

{"json_field_key1":"2016/11/24","json_field_key2":"value"}

使用此代碼的價值因爲,爲了獲得基於JSON場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 

如果你的價值是日期格式只是修改此代碼,如

order by DATE(SUBSTRING_INDEX(SUBSTRING_INDEX(field_name,'json_field_key1":"',-1),'"',1)) DESC

1

只爲像我這樣的人,誰googles並試圖找到解決方案laravel 5.4。您可以使用->運算符來提取JSON,即等於json_extract函數或column->"$.key"語法。

$users->orderBy('column->key', 'desc'); 

看起來好像在2013年底會很有用(微笑)。