我有一个带有json列的表,我在其中存储了契约类型的id列表。我想在contract_types
表上进行连接,以便我可以获得其ID的合同类型名称的连接列表。
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]}
不幸的是,我无法改变存储数组值的方式,即没有引号。
当json数组值以下列两种格式存储时,如何使上述json_contains查询生效:
{"contractTypes": ["1", "2"]}
或
{"contractTypes": ["1,2"]}
*更新*
如果json是第二种格式,即逗号分隔列表,我已经知道如何加入,如下所示:
LEFT JOIN contract_types c on find_in_set(c.id, JSON_EXTRACT(a.criteria, '$.contractTypes'))
现在我只需要在数组值有双引号时加入一些帮助。
答案 0 :(得分: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)
答案 1 :(得分:0)
我已经解决了这个问题。
如果您的 json 列名为“user_ids”并且它具有如下值:
ApplicationSchema
你可以这样做
["1", "2", "3", "4", "5"]
'u' 将返回 1。
此解决方案的关键是确保先用双引号将数字括起来,然后再用单引号将其括起来。