2011-06-27 115 views
1

我有一个表PEOPLE,列'firstName''lastName'(varchars)和'删除'(位)等。MySQL DELETE查询条件

我想从此表中删除具有属性TRUE以便删除的条目,但只有当它们与表中的另一个单独条目共享其确切的firstName和lastName时才有效。

换句话说,从表中删除'删除'的人,但只有当他们是重复的。

不知道如何做到这一点,特别是如何快速做到这一点。任何帮助表示赞赏,谢谢。

+0

你怎么知道哪个是重复的,哪个是主要记录? –

+0

可能重复[数据库中的重复条目](http://stackoverflow.com/questions/5970329/duplicate-entries-in-db) – Neal

+0

所有字段在同一个表中? –

回答

1
DELETE FROM people 
WHERE EXISTS (
    SELECT * 
    FROM people p2 
    WHERE people.firstName = p2.firstName AND people.lastName = p2.lastName 
    GROUP BY firstName, lastName 
    HAVING COUNT(*)>1 
) 
AND deleted = 1 -- True 
+0

你需要嵌套语句中的where子句吗? – Dirk

+0

是的,加入与外表的子查询。 – niktrs

+0

@niktrs,这将需要一个loooong时间是表是巨大的。 – Neal

1

如果你的表中有一个唯一的主键(...取决于设计......),那么这就是需要计算的条目occurrances一个可行的替代方案:

DELETE FROM people as A 
WHERE deleted = 1 
AND EXISTS (SELECT '1' 
      FROM people as B 
      WHERE B.id <> A.id 
      AND A.firstName = B.firstName 
      AND A.lastName = B.lastName) 

这可能比计数行稍好一些。请注意,这个查询可能会遇到前一个答案中可能出现的相同问题;具体来说,如果有两个或更多'已删除'行,并且没有'未删除',他们两个都可能会被删除(没有行!)。如果查询的意图只是在存在“未删除”等效行时删除“已删除”行,请将AND B.deleted = 0作为内部WHERE子句的一部分添加。

+0

太好了 - 这个可以让我很容易'AND B.deleted = 0'解决,我怀疑提问者想要的,而另一个则不需要。 –

+0

建议:使用A.id> B.id,因此所有比第一条记录新的都将被删除。也执行得更快。 – niktrs

+0

@niktrs - 不幸的是,这假定只有后来(或更早)的id被“删除”。根据设计和使用情况,这个假设可能有效也可能不会有效。但是,是的,否则,这可能会表现更好。 –