我有一个表PEOPLE,列'firstName''lastName'(varchars)和'删除'(位)等。MySQL DELETE查询条件
我想从此表中删除具有属性TRUE以便删除的条目,但只有当它们与表中的另一个单独条目共享其确切的firstName和lastName时才有效。
换句话说,从表中删除'删除'的人,但只有当他们是重复的。
不知道如何做到这一点,特别是如何快速做到这一点。任何帮助表示赞赏,谢谢。
我有一个表PEOPLE,列'firstName''lastName'(varchars)和'删除'(位)等。MySQL DELETE查询条件
我想从此表中删除具有属性TRUE以便删除的条目,但只有当它们与表中的另一个单独条目共享其确切的firstName和lastName时才有效。
换句话说,从表中删除'删除'的人,但只有当他们是重复的。
不知道如何做到这一点,特别是如何快速做到这一点。任何帮助表示赞赏,谢谢。
这里是做的一个基本方式:
http://www.justin-cook.com/wp/2006/12/12/remove-duplicate-entries-rows-a-mysql-database-table/
基本上是:
1. GROUP BY
创建一个新表。
2.删除旧表。
3.重命名新表。
+1。一个非常好的替代 – niktrs
如果你的表中有一个唯一的主键(...取决于设计......),那么这就是需要计算的条目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
子句的一部分添加。
太好了 - 这个可以让我很容易'AND B.deleted = 0'解决,我怀疑提问者想要的,而另一个则不需要。 –
建议:使用A.id> B.id,因此所有比第一条记录新的都将被删除。也执行得更快。 – niktrs
@niktrs - 不幸的是,这假定只有后来(或更早)的id被“删除”。根据设计和使用情况,这个假设可能有效也可能不会有效。但是,是的,否则,这可能会表现更好。 –
你怎么知道哪个是重复的,哪个是主要记录? –
可能重复[数据库中的重复条目](http://stackoverflow.com/questions/5970329/duplicate-entries-in-db) – Neal
所有字段在同一个表中? –