mysql - 按存储对象数组的 JSON 列过滤行

标签 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 条件或类似条件,因此我传递的参数与我需要的字段相关。

最佳答案

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

关于mysql - 按存储对象数组的 JSON 列过滤行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45328548/

相关文章:

mysql - 查找第一次出现的连续开始/结束列

json - 在 redis 中存储用户配置文件的更好数据结构是什么?

MySQL根据同一列的两个不同值查找结果

如果连接表中没有记录,mysql 结果

php - MySQL:一次查询多行更新

mysql - 如何分组年份?

sql - Oracle sql日期查询格式个位数

sql - 使用 Go 插入到 Postgresql 表中

php - 全局 PHP 变量在同一文件内的函数内返回 NULL

javascript - jQuery.parseJSON 给出错误意外标记