Ale*_*x G 2 mysql json left-join
我需要选择与用户关联的所有组名称。
尝试了所有可能的解决方案,但没有一个有效。
CREATE TABLE `users` (
`id` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`groups` json NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `groups` (
`id` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `users` (`id`, `name`, `groups`) VALUES('U-1001', 'John Doe', '[\"G-9001\", \"G-9003\"]');
INSERT INTO `groups` (`id`, `name`) VALUES('G-9001', 'Group 1');
INSERT INTO `groups` (`id`, `name`) VALUES('G-9002', 'Group 2');
INSERT INTO `groups` (`id`, `name`) VALUES('G-9003', 'Group 3');
Run Code Online (Sandbox Code Playgroud)
此解决方案有效:使用 MySQL JSON 字段连接表
SELECT u.id, u.name, g.name AS groupname
FROM users u
LEFT JOIN groups g ON JSON_CONTAINS(u.groups, CAST(g.id as JSON), '$')
Run Code Online (Sandbox Code Playgroud)
但只有当我将所有id列更改为 typeINT并将groupsJSON 值更改为时[9001,9003],否则我会得到:
ERROR 3141 (22032): Invalid JSON text in argument 1 to function cast_as_json: "Invalid value." at position 0.
Run Code Online (Sandbox Code Playgroud)
不幸的是,id列必须保持为 type VARCHAR。
预期结果:
+--------+----------+-----------+
| id | name | groupname |
+--------+----------+-----------+
| U-1001 | John Doe | Group 1 |
| U-1001 | John Doe | Group 3 |
+--------+----------+-----------+
Run Code Online (Sandbox Code Playgroud)
请帮忙。谢谢。
我只是错过了周围的引号g.id:
SELECT u.id, u.name, g.name AS groupname
FROM users u
LEFT JOIN groups g ON JSON_CONTAINS(u.groups, JSON_QUOTE(g.id), '$')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8660 次 |
| 最近记录: |