2017-07-26 89 views
0

的阵列我有以下表,其名为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这是字段的名称和相关联的值在上面的例子中,我们有一个手工制作的产品,可以在外部使用。

如果用户想要过滤的产品,他也许会把PARAMS像{"External use": "false", "Handmade":"true"}但现在我只能在一个属性筛选,目前value所以如果我通过true它会带来有value设置为true在任何领域的所有产品。

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

我想知道,如果它可以施加AND条件什么的都为这些对象数组中的一样JSON对象,所以我通过参数是关系到我需要的领域。

回答

0

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

+0

你是什么意思的“生成列”?一个正常的SQL列?我有这些和我使用它们,我省略了查询和表格的90%,以专注于我目前遇到的问题。有时用户会尝试过滤两个自定义列,目前我正在过滤应用程序层,但如果我想使用OFFSET和LIMIT来分页数据库,我无法做到这一点。 – Murilo

+1

生成的或虚拟的列有许多用途,但其中一个用于获取部分JSON数据并将该部分放入其自己的列中。新列可以是快速搜索的索引。示例请参阅http://mysqlserverteam.com/indexing-json-documents-via-virtual-columns/ –