按存储对象数组的 JSON 列过滤行
Filter rows by JSON column that stores array of objects
我有以下 table,它被称为 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"},
....
]
要过滤的查询的重要属性是 name
和 value
,它们分别是字段的名称和与该特定产品关联的值,在上面的示例中,我们有一个产品手工制作,可外用
如果用户想要过滤产品,他可能会发送 {"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
条件或类似的东西,所以我传递的参数与字段相关我需要
是的,你可以。但是为了从这些数据中获得性能,我建议创建一个(或两个)生成列并为其建立索引以加快查询速度。
我有以下 table,它被称为 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"},
....
]
要过滤的查询的重要属性是 name
和 value
,它们分别是字段的名称和与该特定产品关联的值,在上面的示例中,我们有一个产品手工制作,可外用
如果用户想要过滤产品,他可能会发送 {"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
条件或类似的东西,所以我传递的参数与字段相关我需要
是的,你可以。但是为了从这些数据中获得性能,我建议创建一个(或两个)生成列并为其建立索引以加快查询速度。