2016-05-29 32 views
0

有一列表,其中有一列,名爲「info」,其內容類似於{"Twitter": 28, "Total": 28, "Facebook": 1}。當我編寫sql時,我想測試「Total」是否大於10。有人可以幫我寫查詢嗎? (表名是landslides_7d帶有{「Twitter」:28,「Total」:28,「Facebook」的mySQL表格:1}

(這就是我)

SELECT * FROM landslides_7d WHERE info.Total > 10; 

感謝。

+0

當你說'我想測試'時,你究竟是什麼意思?你想要一個*列表*的所有行'總計'是> 10?或者,計算有多少行?或者,給定一行,你是否想要一個「true/false」值來判斷行是否符合這個標準? –

+0

我想要一個總計> 10的所有行的列表 –

+0

您的表格必須至少有2列。你是通過某種JSON工具或API生成器來提取數據嗎? –

回答

0

您可能正在將JSON存儲在單個Blob或字符串列中。這是非常低效的,因爲您無法使用索引,並且需要在每個查詢處解析整個JSON結構。我不確定你需要多少靈活性,但是如果JSON屬性相對固定,我建議在表格內容上運行一個腳本(ruby,Python等)並將「total」存儲爲傳統的列式格式。例如,您可以添加一個新的「total」列,其中包含total屬性作爲INT。

使用腳本的一個好處是,您可以捕獲任何格式不正確的JSON,這是您在單個查詢中無法做到的。

您還可以使用@johannes答案中引用的JSON_EXTRACT函數,通過觸發器(在更新/插入「info」時)保持「total」列。

+0

如果'JSON_EXTRACT'可用,你很可能在MySQL 5.7上。然後,您可以使用生成的列而不是手動觸發器,這需要較少的存儲空間(只存儲索引)並且可靠(數據庫能夠理解目的)http://mysqlserverteam.com/generated-columns-in-mysql- 5-7-5 / – johannes

1

數據格式似乎是JSON。如果你有MySQL 5.7,你可以使用JSON_EXTRACT或簡稱->。這些功能在舊版本中不存在。

SELECT * FROM landslides_7d WHERE JSON_EXTRACT(info, '$.total') > 10; 

SELECT * FROM landslides_7d WHERE info->total > 10; 

http://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json-extract

記住,這是一個全表掃描。在一個「較大」的表上你想創建一個索引。

如果您使用的是較舊版本的MySQL,則應在表格中創建一個額外的列並手動將總值添加到該列。

相關問題