按JSON列过滤行,该列存储对象数组

时间:2017-07-26 13:33:52

标签: mysql sql json mysql-json

我有下表,其名为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条件或类似的东西,因此我传递的参数与我需要的字段相关。

1 个答案:

答案 0 :(得分:1)

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