MySql Select inside Select with Operator IN

MySql Select inside Select with Operator IN

我有 2 个表:

+------------+------------+
|  id_group  |  id_user   |
+------------+------------+
| 1          | 1,2,3,4    |

用户

+------------+-----------+
|   id_user  |   name    |
+------------+-----------+
| 1          | james     |
| 2          | lars      |
| 3          | kirk      |
| 4          | robert    |

我想使用这个查询:

select id_group as id, (select name from user where id_user IN (id_user)) as name
from group
where id_group = 1

结果:

+--------+-------------------------+
|   id   |           name          |
+--------+-------------------------+
| 1      | james,lars,kirk,robert  |

试试这个:

SELECT 
    id_group AS id, 
    (SELECT GROUP_CONCAT(name) FROM user WHERE id_user IN (id_user)) AS name
FROM group
WHERE a.id_group = 1

或者

这假定字符串中包含初始和最终单引号。

SELECT 
    id_group AS id, 
    (SELECT 
        GROUP_CONCAT(name) 
     FROM user 
     WHERE id_user IN (REPLACE(id_user,  ',', ''','''))
    ) AS name
FROM group
WHERE a.id_group = 1

如果没有,您可以添加它们。

SELECT 
    id_group AS id, 
    (SELECT 
        GROUP_CONCAT(name) 
     FROM user 
     WHERE id_user IN ('''' + REPLACE(id_user,  ',', ''',''') + '''')
    ) AS name
FROM group
WHERE id_group = 1

IN 将不起作用,因为组中的 id_user 将作为文本处理,因此 FIND_IN_SET 更好但速度较慢的可能性

但你应该紧急阅读Is storing a delimited list in a database column really that bad?

CREATE TABLE `group` (
  `id_group` INTEGER,
  `id_user` VARCHAR(7)
);

INSERT INTO `group`
  (`id_group`, `id_user`)
VALUES
  ('1', '1,2,3,4');
CREATE TABLE user (
  `id_user` INTEGER,
  `name` VARCHAR(6)
);

INSERT INTO user
  (`id_user`, `name`)
VALUES
  ('1', 'james'),
  ('2', 'lars'),
  ('3', 'kirk'),
  ('4', 'robert'),
  ('5', 'peter');
select id_group as id
, (select GROUP_CONCAT(name ORDER BY id_user ASC) from user u where FIND_IN_SET(u.id_user, g.id_user)) as name
from `group` g
where id_group = 1
id | name                  
-: | :---------------------
 1 | james,lars,kirk,robert

db<>fiddle here