2016-05-29 33 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,则应在表格中创建一个额外的列并手动将总值添加到该列。

相关问题