我正在使用支持JSON数据字段的MYSQL 5.7.11。
我的一个表中有一个JSON字段,用于存储产品的价格历史记录:
JSON结构示例:
[{"da": "2016-05-03 08:32", "pr":15.90}]
[{"da": "2016-03-22 09:02", "pr":14.40}]
[{"da": "2016-03-15 12:08", "pr":40.00}, {"da": "2016-06-28 10:32", "pr":42.00}]
[{"da": "2016-03-29 02:39", "pr":13.90}]
[{"da": "2016-05-03 08:38", "pr":17.90},{"da": "2016-07-19 10:18", "pr":26.80},{"da": "2016-07-19 14:20", "pr":24.80}]
如您所见,它可以在一行中包含多个JSON数组。样本中的每个JSON行代表一个不同的产品。就像第一行价格15.90是苹果,第二行14.40是ORANGE,第三行40.00和42.00是香蕉。只是为了澄清这一点。
我正在寻找的是能够在日期范围之间进行搜索。
就像获取日期A到日期B之间的所有产品价格历史记录一样。
为了进行测试,我尝试执行以下操作:
select json_extract(json_price_history, '$.pr')=13.90 from products
但是它总是返回很多行,而只有NULL。
任何帮助,将不胜感激...
您查询中的jsonpath希望从JSON字典中提取名为pr的元素。但是您的表不包含字典。它具有一个数组,其中每个元素都是一个字典。因此,查询应更改如下:
SELECT JSON_EXTRACT(DICT, '$[*].pr') FROM myjson;
这将显示以下内容:
+---------------------------------------------+
| JSON_UNQUOTE(JSON_EXTRACT(DICT, '$[*].pr')) |
+---------------------------------------------+
| NULL |
| [15.9] |
| [14.4] |
| [40, 42] |
| [13.9] |
| [17.9, 26.8, 24.8] |
+---------------------------------------------+
将数组存储在RDBMS中非常好。但是,如果您发现自己必须在那些数组中搜索某些内容,则意味着您的数据库设计错误。我还没有看到在mysql文档中明确提到的这个问题,但是在postgreql那里您可以得到很多[更高级的json和数组支持] [1]对此非常清楚。
提示:数组不是集合;搜索特定的数组元素可能是数据库设计错误的标志。考虑使用单独的表,其中每个项都有一行,这将是一个数组元素。这将更易于搜索,并且可能会针对大量元素进行更好地缩放。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句