如何正确查找重复项并删除它们

时间:2014-03-12 17:39:41

标签: mysql sql

我正在尝试运行查询,但在某些时候我的逻辑是错误的,我在查找为什么不删除/选择正确的数据时遇到了问题。

我需要问的问题是: 如何删除重复resource_type=2 FROM user_address并保留原始resource_type=2

我创建了以下查询。 问题当我测试我的最终查询并检查其中一些结果时,其中一些没有重复的resource_type=2,这不应该存在。我无法在查询中找到逻辑问题。

有人能发现问题吗?

Query为我提供了602结果在尝试查找有重复项的人时。因此,我的602 user_address是独一无二的

SELECT MIN(id)
FROM user_address 
WHERE resource_type=2  
GROUP BY member_num 
HAVING COUNT(resource_type) > 1

如果我执行以下查询,我会得到7420结果

SELECT count(*)
FROM user_address 
WHERE resource_type=2 

当我执行选择查询以检查要删除的内容时,我得到6,818结果

SELECT * FROM user_address 
    WHERE id NOT IN 
    (select * from 
        (SELECT MIN(id)
            FROM user_address 
            WHERE resource_type=2  
            GROUP BY member_num 
            HAVING COUNT(resource_type) > 1
        ) as t) AND resource_type <> 1 AND resource_type <> 3 AND resource_type <> 4 

2 个答案:

答案 0 :(得分:0)

这些都是有道理的。

根据您的定义(在多行上resource_type = 2),您有602个重复的值。

您有7,420个,其中包含resource_type = 2

您有6,818行符合最终查询中的任何条件。 602 + 6,818 = 7,420可能是巧合。

我认为您想要的查询更像是:

delete ua from user_addresses ua join
               (SELECT MIN(id) as minid, member_num
                FROM user_address 
                WHERE resource_type=2  
                GROUP BY member_num 
                HAVING COUNT(resource_type) > 1
               ) tokeep
               on ua.member_num = tokeep.member_num and
                  ua.id > tokeep.minid;

我不知道最终select查询中的附加条件是什么。

答案 1 :(得分:0)

假设没有空值,您将GROUP BY唯一列,并选择MIN(或MAX)RowId作为要保留的行。

这个答案看起来很有用:

https://stackoverflow.com/a/18949/367006