从MYSQL中的表中删除重复的电子邮件地址

时间:2011-05-09 10:49:14

标签: mysql duplicate-removal

我有一个包含IDfirstnamelastnameaddressemail等列的表格。

有没有办法从TABLE中删除重复的email地址?

其他信息(来自评论):

如果有两行具有相同的email地址,则会有一个正常firstnamelastname,但另一行会有'即时' firstname。因此我可以区分它们。我只想删除名为'instant'的那个。

注意,firstname='Instant'只有1 email个地址的一些记录。我不想只删除一个唯一的电子邮件地址,因此我不能删除firstname='Instant'中的所有内容。

请帮帮我。

6 个答案:

答案 0 :(得分:8)

DELETE n1 FROM customers n1, customers n2 WHERE n1.ID > n2.ID AND n1.email = n2.email

答案 1 :(得分:4)

DELETE FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY email)

这为每封电子邮件保留了最低的第一个插入ID。

答案 2 :(得分:2)

虽然MiPnamic的答案基本上是正确的,但它并不能解决您保留哪条记录以及丢弃哪条记录(以及如何整理相关记录)的问题。简短的回答是,这不能以编程方式完成。

给出这样的查询:

SELECT email, MAX(ID), MAX(firstname), MAX(lastname), MAX(address)
FROM customers

使情况更糟 - 因为您可能会从重复行中选择混合字段。你需要做类似的事情:

SELECT csr2.*
FROM customers csr2
WHERE ID IN (
   SELECT MAX(id)
   FROM customers csr
   GROUP BY email
);

获取一组唯一的现有行。当然,您仍然需要整理所有已处理的记录(提示 - 这是上面的查询未返回的客户表ID)。

答案 3 :(得分:0)

  • 复制表格结构
  • 在新表格的电子邮件上添加一个唯一密钥(仅为安全起见)
  • 对新表执行INSERT通过电子邮件地址从旧版GROUPING中选择数据

答案 4 :(得分:0)

我不知道这是否可以在MYSQL中使用(我还没有使用过它)...但你应该可以做类似下面的代码片段。

我建议你运行它们,以便了解是否选择了正确的数据。如果确实有效,那么您可能希望在列上创建约束。

获取所有重复的电子邮件地址:

SELECT 
    EMAILADDRESS, COUNT(1)
FROM
    TABLE
GROUP BY EMAILADDRESS
HAVING COUNT(1) > 1

然后从中确定ID:

SELECT
    ID
FROM 
    TABLE
WHERE 
    EMAILADDRESS IN (
        SELECT 
            EMAILADDRESS
        FROM
            TABLE
        GROUP BY EMAILADDRESS
        HAVING COUNT(1) > 1
    )

最后,根据上述和其他约束删除行:

DELETE 
FROM 
    TABLE
WHERE
    ID IN (
        SELECT
            ID
        FROM 
            TABLE
        WHERE 
            EMAILADDRESS IN (
                SELECT 
                    EMAILADDRESS
                FROM
                    TABLE
                GROUP BY EMAILADDRESS
                HAVING COUNT(1) > 1
            )
    )  
    AND FIRSTNAME = 'Instant'

答案 5 :(得分:0)

使用上面的 forsvarir 答案去去重的另一种方法,但稍微修改一下。通过这种方式,您可以保留您选择分区的记录:

BEGIN TRAN

DELETE 
FROM   [TABLE]
WHERE
ID IN (
    SELECT a.ID
    
    FROM
    (
        SELECT  ROW_NUMBER() OVER(PARTITION BY Email ORDER BY Email) [RowNum], ID, Email
        FROM    [TABLE]
        WHERE   Email IN 
                (
                    SELECT 
                        Email
                    FROM
                        [TABLE]
                    GROUP BY Email
                    HAVING COUNT(1) > 1
                )
    ) a
    WHERE a.RowNum > 1
)

--COMMIT TRAN
--ROLLBACK TRAN