MySQL DELETE查询条件

时间:2011-06-27 17:30:01

标签: mysql sql sql-delete

我有一个表PEOPLE,列'firstName''lastName'(varchars)和'deleted'(bit)等。

我想从此表中删除已删除属性为TRUE的条目,但前提是它们与表中另一个单独的条目共享其确切的firstName和lastName。

换句话说,从表中删除'已删除'的人,但仅限于他们是重复的。

不确定如何做到这一点,尤其不是如何快速做到这一点。感谢任何帮助。谢谢。

3 个答案:

答案 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

答案 1 :(得分:1)

如果您的表具有唯一的主键(...将取决于设计......),那么这是需要计算条目出现次数的可行替代方法:

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子句的一部分。

答案 2 :(得分:0)

这是一种基本的方法:

http://www.justin-cook.com/wp/2006/12/12/remove-duplicate-entries-rows-a-mysql-database-table/

基本上:
1.使用GROUP BY创建一个新表 2.删除旧表。
3.重命名新表。