假设我有这张表:
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
答案 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
变量只能容纳一个条目。您可以使用临时表来存储所需的数据。
您可以尝试连接而不是子查询。虽然没有尝试过:
delete from t_user u1
inner join t_user u2 on u1.usr = u2.usr
WHERE u2.grp < 6