有一列表,其中有一列,名为“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;
感谢。
有一列表,其中有一列,名为“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;
感谢。
您可能正在将JSON存储在单个Blob或字符串列中。这是非常低效的,因为您无法使用索引,并且需要在每个查询处解析整个JSON结构。我不确定你需要多少灵活性,但是如果JSON属性相对固定,我建议在表格内容上运行一个脚本(ruby,Python等)并将“total”存储为传统的列式格式。例如,您可以添加一个新的“total”列,其中包含total属性作为INT。
使用脚本的一个好处是,您可以捕获任何格式不正确的JSON,这是您在单个查询中无法做到的。
您还可以使用@johannes答案中引用的JSON_EXTRACT函数,通过触发器(在更新/插入“info”时)保持“total”列。
如果'JSON_EXTRACT'可用,你很可能在MySQL 5.7上。然后,您可以使用生成的列而不是手动触发器,这需要较少的存储空间(只存储索引)并且可靠(数据库能够理解目的)http://mysqlserverteam.com/generated-columns-in-mysql- 5-7-5 / – johannes
数据格式似乎是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,则应在表格中创建一个额外的列并手动将总值添加到该列。
当你说'我想测试'时,你究竟是什么意思?你想要一个*列表*的所有行'总计'是> 10?或者,计算有多少行?或者,给定一行,你是否想要一个“true/false”值来判断行是否符合这个标准? –
我想要一个总计> 10的所有行的列表 –
您的表格必须至少有2列。你是通过某种JSON工具或API生成器来提取数据吗? –