0

假设我有这张桌子:

drop table if exists t_user;
CREATE TABLE t_user (usr int, grp int);
INSERT INTO t_user VALUES (123456, 5);
INSERT INTO t_user VALUES (111111, 5);
INSERT INTO t_user VALUES (111311, 5);
INSERT INTO t_user VALUES (122111, 5);
INSERT INTO t_user VALUES (111111, 5);
INSERT INTO t_user VALUES (111211, 5);
INSERT INTO t_user VALUES (113211, 5);
INSERT INTO t_user VALUES (115311, 5);
INSERT INTO t_user VALUES (122253, 3);
INSERT INTO t_user VALUES (222331, 6);
INSERT INTO t_user VALUES (118811, 3);
INSERT INTO t_user VALUES (112111, 6);
INSERT INTO t_user VALUES (213111, 6);
INSERT INTO t_user VALUES (343321, 7);
INSERT INTO t_user VALUES (114431, 2);
INSERT INTO t_user VALUES (115111, 8);
INSERT INTO t_user VALUES (324353, 3);

我想运行这样的查询:

SELECT distinct @u := usr FROM t_user WHERE grp < 6;

要保存一组用户的 ID,并在delete将删除所有这些用户的语句中使用结果:

delete from t_user where usr in ( @u );

问题是每次我运行这两个语句时,第一个列出的用户都会被删除,而不是我想要的所有用户。

编辑

我不能简单地在单个查询上运行所有内容。我真的很想知道如何分开做。

编辑²

我按照@juergen 说明并尝试使用临时表:

CREATE TEMPORARY TABLE t_temp (id int);

INSERT INTO t_temp SELECT DISTINCT usr FROM t_user WHERE grp < 6;

DELETE FROM t_user WHERE usr IN ( SELECT * FROM t_temp );

DROP TABLE t_temp;

我搜索并找到了一些类似的答案,但我不想构建一个字符串并在我的删除语句中使用它。我想要更简单的东西。

如何将查询结果存储到临时表中: -在 MySQL 中创建表变量

4

1 回答 1

3

只需在一个查询中完成

delete from t_user 
where usr in (SELECT distinct usr FROM t_user WHERE grp < 6)

甚至更短

delete from t_user WHERE grp < 6

编辑

一个变量只能保存一个条目。您可以使用临时表来存储您想要的数据。

编辑 2

您可以尝试加入而不是子查询。虽然没试过:

delete from t_user u1
inner join t_user u2 on u1.usr = u2.usr 
WHERE u2.grp < 6
于 2012-07-11T19:56:59.887 回答