2017-07-07 35 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的用戶,但保留一個用戶,如果存在具有相同名稱AND fav_color其dob> = 2001-01-01的其他用戶。

所以在這個例子中,最喜歡的顏色是藍色和約翰的jane將被刪除。

到目前爲止,我已經試過:

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是不正確的。我想你想使用EXIST(或在這種情況下NOT EXIST

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

您可以通過使用排除加入做到這一點沒有子查詢。

嘗試按照您描述的標準將用戶「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; 
相關問題