2017-07-07 8 views
0

に存在しない場合、私は次の表は、MySQLデータベース内tbl_testと呼ばれています:英語で削除ユーザーは他のユーザーが同様の特徴

+------+------------+------------+ 
| name | fav_color | dob  | 
+======+============+============+ 
| jane | blue  | 1996-07-07 | 
+------+------------+------------+ 
| jane | pink  | 1996-07-07 | 
+------+------------+------------+ 
| jane | pink  | 2016-07-07 | 
+------+------------+------------+ 
| joe | pink  | 2001-07-07 | 
+------+------------+------------+ 
| john | red  | 1997-07-07 | 
+------+------------+------------+ 

、ここで私が達成したいものです。

削除dobを持つすべてのユーザー< 2001-01-01同じ名前の別のユーザーが存在し、fav_colorがdob> = 2001-01-01のユーザーが存在する場合はユーザーを保持します。

この例では、お気に入りの色が青色でjohnのジェーンが削除されます。

DELETE FROM tbl_test 
WHERE dob < '2000-01-01' AND name, fav_color NOT IN 
(SELECT T.name, T.fav_color FROM 
(SELECT name, fav_color FROM tbl_test WHERE dob >= '2000-01-01') T); 

しかし、私は、このコマンドを入力すると、MySQLは構文エラーがスローされます。

はこれまでのところ、私が試してみました。どのように私はこれを達成するためのヒント?

答えて

1

MySQLでは、残りのステートメントで削除されるテーブルを参照することはできません。したがって:

DELETE t 
    FROM tbl_test t LEFT JOIN 
     (SELECT t2.name, t2.fav_color 
      FROM tbl_test t2 
      WHERE dob >= '2000-01-01' 
     ) tt 
     ON t.name = tt.name AND t.fav_color = tt.fav_color 
    WHERE t.dob < '2000-01-01' AND tt.name IS NULL; 

あなたの方法は非常に合理的です。また、他の構文エラー(たとえば、NOT INの最初の引数にかっこが付くなど)があります。ただし、それらを修正しても、クエリに問題が発生します。

0

これはあなたが望むものであるかわかりませんが、INの使用は正しくありません。私はあなたがに参加除外を使用してサブクエリせずにこれを行うことができます

DELETE FROM tbl_test 
WHERE dob < '2000-01-01' 
AND NOT EXIST(
    SELECT null FROM tbl_test as tt 
    WHERE tt.name = tbl_test.name 
     AND tt.fav_color = tbl_test.fav_color 
     AND dob >= '2000-01-01' 
) 
0

あなたがEXIST(またはこの場合NOT EXISTで)を使用したいと思います。

"t1"というユーザーを、別のユーザー "t2"とあなたが記述した条件で結合しようとします。見つからない場合、OUTER JOINはt2のすべての列をNULLにします。この場合、t1を削除してください。

DELETE t1 
FROM tbl_test AS t1 
LEFT OUTER JOIN tbl_test AS t2 
    ON t1.name = t2.name AND t1.fav_color = t2.fav_color AND t2.dob >= '2000-01-01' 
WHERE t1.dob < '2000-01-01' 
    AND t2.name IS NULL; 
関連する問題