2017-06-27 2 views
0

私は契約タイプのIDのリストを格納しているjson列のテーブルを持っています。 contract_typesテーブルの結合を行いたいので、そのIDの契約タイプ名の連結リストを取得できます。MySQL - JSON_CONTAINSは引用符またはコンマで区切られた文字列を持つ配列では機能しませんか?

CREATE TABLE `my_alerts` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(255) NOT NULL, 
    `criteria` JSON NULL DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 


CREATE TABLE `contract_types` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

INSERT INTO contract_types (id, name) VALUES (1, 'Full time'); 
INSERT INTO contract_types (id, name) VALUES (2, 'Part time'); 

INSERT INTO my_alerts (id, name, criteria) VALUES (1, 'test', '{"contractTypes": ["1", "2"]}'); 

私は次のクエリを試したが、それは動作しません:

SELECT 
    a.id, 
    a.name, 
    GROUP_CONCAT(c.name SEPARATOR ', ') as contractTypes 
FROM my_alerts a 
LEFT JOIN contract_types c on JSON_CONTAINS(a.criteria, CAST(c.id as JSON), '$.contractTypes') 
group by a.id 

私は唯一の私は、JSONの列を変更し、引用符なしで配列の値を格納した場合、クエリは仕事を得ることができます。

{"contractTypes": [1, 2]} 

は、残念ながら、私は、配列の値を引用符なしで、すなわち保存されている方法を変更することができませんでしだ。

{"contractTypes": ["1", "2"]} 

または

{"contractTypes": ["1,2"]} 

* UPDATE *

:JSON配列の値は、次の2つの形式で格納されている場合、私は上記のjson_containsクエリが動作するように取得できますか

jsonが2番目の形式、つまりカンマ区切りのリストの場合、次のように私がどのように参加できるかを考えました:

LEFT JOIN contract_types c on find_in_set(c.id, JSON_EXTRACT(a.criteria, '$.contractTypes')) 

これで、配列の値に二重引用符が含まれている場合にのみ、助けが必要です。

答えて

0

試してみて、何が必要調整:

mysql> SELECT 
    -> CAST(JSON_ARRAY(GROUP_CONCAT(`id` SEPARATOR ', ')) AS JSON) 
    -> FROM `contract_types`; 
+-------------------------------------------------------------+ 
| CAST(JSON_ARRAY(GROUP_CONCAT(`id` SEPARATOR ', ')) AS JSON) | 
+-------------------------------------------------------------+ 
| ["1, 2"]             | 
+-------------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT 
    -> CAST(REPLACE(GROUP_CONCAT(JSON_ARRAY(CAST(`id` AS CHAR))), '],[', ', ') AS JSON) 
    -> FROM `contract_types`; 
+----------------------------------------------------------------------------------+ 
| CAST(REPLACE(GROUP_CONCAT(JSON_ARRAY(CAST(`id` AS CHAR))), '],[', ', ') AS JSON) | 
+----------------------------------------------------------------------------------+ 
| ["1", "2"]                  | 
+----------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 
関連する問題