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
我有 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