带有用户变量的MySQL DELETE语句在where-in子句中?

时间:2012-07-11 19:54:17

标签: mysql where-clause sql-drop user-variables

假设我有这张表:

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

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

修改

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

EDIT²

我按照@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;

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

如何将查询结果存储到临时表中:   - Create table variable in MySQL

1 个答案:

答案 0 :(得分: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