【问题标题】:MySQL - How to search within JSON datafieldMySQL - 如何在 JSON 数据字段中搜索
【发布时间】:2016-07-23 06:44:03
【问题描述】:

我正在使用支持 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 是橙色,第三行 40.00 和 42.00 是香蕉。只是为了说明这一点。

我正在寻找的是能够在日期范围之间进行搜索。

获取日期 A 到日期 B 之间的所有产品价格历史记录。

出于测试目的,我尝试做这样的事情:

select json_extract(json_price_history, '$.pr')=13.90 from products

但它总是返回许多只有 NULL 的行。

任何帮助将不胜感激......

【问题讨论】:

    标签: mysql jsonpath mysql-5.7 mysql-json


    【解决方案1】:

    JsonPath.

    查询中的 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 中存储数组

    在 RDBMS 中存储数组非常好。但是,如果您发现自己必须在这些数组中搜索某些内容,则意味着您的数据库设计错误。我没有在 mysql 文档中看到明确提到这一点,但是你得到很多 [更高级的 json 和数组支持][1] 的 postgreql 对此非常清楚。

    提示:数组不是集合;搜索特定的数组元素可以 数据库设计错误的标志。考虑使用一个单独的表 将成为数组元素的每个项目的行。这会更容易 进行搜索,并且可能会更好地扩展大量 元素。

    【讨论】:

    • 感谢您的回复。是否可以仅“提取”至少一个价格高于 X 且低于 Y 的行?例如 - 如果它大于 10 且小于 18:结果将是 [15.9] [14.4] [13.9][17.9,26.8,24.8]
    • AFAIK mysql 不支持测试数组元素是否大于(或小于)常量。它只支持搜索数组是否包含常量。
    • 我明白了。可惜没有。我想会的。感谢您的回答。
    • 刚刚更新:我完全删除了 json,只使用标准 RDBMS 作为历史记录.. 更好的解决方案。
    • 我完全同意你的看法
    猜你喜欢
    • 2018-04-01
    • 2020-06-01
    • 1970-01-01
    • 2020-10-04
    • 2015-08-05
    • 2018-09-17
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多