2017-07-26 129 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/ –