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

問題は、これらの 2 つのステートメントを実行するたびに、最初にリストされたユーザーが削除され、すべてのユーザーが削除されるわけではないことです。

編集

1 つのクエリですべてを単純に実行することはできません。私は本当にそれを個別に行う方法を知りたいです。

編集²

@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

1つのクエリでそれを行うだけです

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

またはさらに短い

delete from t_user WHERE grp < 6

編集

変数は 1 つのエントリしか保持できません。一時テーブルを使用して、必要なデータを格納できます。

編集 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 に答える