2017-06-01 102 views
3

我有一個表,它看起來象下面這樣:的MySQL 5.7 json_extract的關鍵

表數據

id params 
1 {"company1X":{"price":"1124.55"},"company2X":{"price":"1,124.55"},"company3X":{"price":""},"company4X":{"price":""},"company5X":{"price":"1528.0"}} 

我不知道「公司」的名字在我的要求使用。

如何獲取按價格排序的我的數據? 謝謝!

P.S我試過從數據中選擇json_extract(params,'$ [*]。price'),但它不起作用(返回空值)。

+1

所有你擁有的是「公司」,「價格」對?使用兩列,而不是JSON。 –

回答

5

$[*]獲取JSON數組的所有元素,而不是對象。這是一個對象,所以你得到NULL。

$.*將爲您提供JSON對象中的所有元素,因此$.*.price會爲您提供所有價格的JSON數組。

mysql> select json_extract(params, '$.*.price') from foo; 
+-------------------------------------------+ 
| json_extract(params, '$.*.price')   | 
+-------------------------------------------+ 
| ["1124.55", "1,124.55", "", "", "1528.0"] | 
+-------------------------------------------+ 

現在出現了問題。就SQL而言,這是一行。它不能使用正常的order by進行排序,該功能適用​​於行。

MySQL沒有排序JSON的功能...所以你被卡住了。您可以返回JSON數組,讓任何正在接收數據的數據進行排序。您可能可以編寫一個存儲過程來對數組進行排序......但支持糟糕的表設計需要很多工作。相反,更改表格。


真正的問題是這是一個糟糕的JSON列的使用。

JSON列擊敗了SQL數據庫的大部分點(PostgreSQL中的JSON支持更好)。 SQL數據庫可以處理行和列,但JSON會將多行和多列轉換爲單個單元格。

因此,應該謹慎使用JSON列;通常當你不確定你需要存儲什麼類型的數據時。像「價格」這樣的要搜索和排序的重要信息應該按照正常的列進行。

您需要將表格更改爲包含公司名稱和價格列的正常SQL表格。然後,您可以使用普通的SQL功能,如order by,性能將受益於索引。您的問題中沒有足夠的信息來建議該表的外觀。

+0

如何使用密鑰{「company1x」:「1124.55」,「company2x」:「1,124.55」,「company3x」:「」,「company4x」:「」,「company1x」:「1528.0」}獲取數據@Schwern –

+0

@ PraveenR [MySQL JSON文檔](https://dev.mysql.com/doc/refman/5.7/en/json.html#json-paths)應該解釋。如果你還不確定,問一個問題,你會得到一個答案。 – Schwern