2017-07-07 23 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; 
相关问题