【问题标题】:MySQL LEFT JOIN ON JSON fieldMySQL LEFT JOIN ON JSON 字段
【发布时间】:2018-09-05 08:10:48
【问题描述】:

我需要选择用户关联的所有组名。

尝试了所有可能的解决方案,但都没有奏效。

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');

此解决方案有效:Using MySQL JSON field to join on a table

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), '$')

但只有当我将所有id 列更改为INT 并将groups JSON 值更改为[9001,9003] 时,否则我会得到:

ERROR 3141 (22032): Invalid JSON text in argument 1 to function cast_as_json: "Invalid value." at position 0.

很遗憾,id 列必须保持为 VARCHAR 类型。

预期结果:

+--------+----------+-----------+
| id     | name     | groupname |
+--------+----------+-----------+
| U-1001 | John Doe | Group 1   |
| U-1001 | John Doe | Group 3   |
+--------+----------+-----------+

请帮忙。谢谢。

【问题讨论】:

    标签: mysql json left-join


    【解决方案1】:

    我只是错过了 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), '$')
    

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 2013-09-25
      • 2015-07-05
      • 2011-06-26
      相关资源
      最近更新 更多