【问题标题】:Filter rows by JSON column that stores array of objects按存储对象数组的 JSON 列过滤行
【发布时间】:2017-07-26 13:33:51
【问题描述】:

我有下表,它被称为products 我省略了我不需要的列:

+---------------------+----------------+------+-----+---------+----------------+
| Field               | Type           | Null | Key | Default | Extra          |
+---------------------+----------------+------+-----+---------+----------------+
| id                  | int(11)        | NO   | PRI | NULL    | auto_increment |
| name                | varchar(255)   | NO   |     | NULL    |                |
| custom_fields       | json           | YES  |     | NULL    |                |
| parent_variation_id | int(11)        | YES  | MUL | NULL    |                |
| variation_fields    | json           | YES  |     | NULL    |                |
+---------------------+----------------+------+-----+---------+----------------+

我有两个 JSON 列,我想在同一个查询中使用它们来过滤产品及其变体。两列具有相同的结构,类似于存储产品可能具有的自定义字段:

[
    {"name": "External use", "type": "checkbox", "value":"true"},
    {"name": "Handmade", "type": "checkbox", "value":"true"},
    ....
]

要过滤的查询的重要属性是namevalue,它们分别是字段的名称和与该特定产品关联的值,在上面的示例中,我们有一个手工制作的产品,可以外用。

如果用户想要过滤产品,他可能会发送{"External use": "false", "Handmade":"true"} 之类的参数,但现在我只能过滤一个属性,目前是value,所以如果我通过true,它将带来所有具有value 的产品在任何字段中设置为 true。

SELECT * 
FROM   `products` 
WHERE   json_search(custom_fields, 'all', 'true', NULL, '$[*].value') IS NOT NULL 

我想知道是否可以为这些对象数组中的同一个 JSON 对象应用 AND 条件或类似条件,因此我传递的参数与我需要的字段相关。

【问题讨论】:

    标签: mysql sql json mysql-json


    【解决方案1】:

    是的,你可以。但是为了从这些数据中获得性能,我建议创建一个(或两个)生成的列并将其编入索引以加快查询速度。

    【讨论】:

    • “生成的列”是什么意思?一个普通的 SQL 列?我有这些并且我使用它们,我省略了 90% 的查询和表来专注于我目前遇到的问题。有时用户会尝试按两个自定义列进行过滤,目前我正在应用层上进行过滤,但如果我想使用 OFFSET 和 LIMIT 在 DB 上进行分页,我就不能这样做。
    • 生成的或虚拟的列有很多用途,但其中之一是获取 JSON 数据的一部分并将该部分放在它自己的列中。该新列可以作为快速搜索的索引。示例参考mysqlserverteam.com/indexing-json-documents-via-virtual-columns
    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多