Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从MYSQL中的表中删除重复的电子邮件地址_Mysql_Duplicate Removal - Fatal编程技术网

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

从MYSQL中的表中删除重复的电子邮件地址,mysql,duplicate-removal,Mysql,Duplicate Removal,我有一个表,其中列有ID、firstname、lastname、address、email等等 有没有办法从表中删除重复的电子邮件地址 其他信息(来自评论): 如果有两行具有相同的电子邮件地址,其中一行将具有正常的名和名,但另一行将具有名中的“即时”。因此,我可以区分它们。我只想删除名为“instant”的 注意,有些记录中的firstname='Instant'只有一个电子邮件地址。我不想只删除一个唯一的电子邮件地址,所以我不能只删除firstname='Instant'中的所有内容 请帮帮我

我有一个表,其中列有
ID
firstname
lastname
address
email
等等

有没有办法从表中删除重复的
电子邮件
地址

其他信息(来自评论):

如果有两行具有相同的
电子邮件
地址,其中一行将具有正常的
,但另一行将具有名中的“即时”。因此,我可以区分它们。我只想删除名为“instant”的

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

请帮帮我

  • 复制表结构
  • 在新表的电子邮件上放置唯一键(仅出于安全考虑)
  • 在新表上执行插入操作,按电子邮件地址从旧表分组中选择数据

虽然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
);

获取一组唯一的现有行。当然,您仍然需要对所有创建的记录进行排序(提示-这是上面的查询未返回的IDs ni customers表)。

我不知道这在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'

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

使用上面的forsvarir答案进行dedeupe的另一种方法,但对其进行一些修改。通过这种方式,您可以保留选择分区的记录:

DELETE n1 FROM customers n1, customers n2 WHERE n1.ID > n2.ID AND n1.email = n2.email
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

如果你不介意告诉我mysql中执行这三个步骤的步骤。我只是个初学者。你不能只按电子邮件地址分组。“select”子句中的所有内容都必须位于“group by”子句中。如果说“地址”(表中的另一列)有额外的空间,这是如何工作的?您仍然有两行,但第二行将无法插入(我希望同一语句中的任何其他插入都会失败)。这可能符合OP的要求(如果实现正确),但这似乎是一个糟糕的解决方案……你是对的。我允许重复的电子邮件地址下订单,这是一种糟糕的编程实践。现在我觉得他们有问题了。你打算怎么处理这一排的其他人?如果您有两个同名的电子邮件地址,您会怎么做?您是同时删除两封重复的电子邮件,还是只删除一封?你如何决定哪一个?如果有两个相同的电子邮件地址,一个会有正常的名字和姓氏,另一个会有“即时”的名字。因此,我可以区分它们。我只想删除名为“instant”的邮件。为什么不
删除其中firstname='instant'
?但在某些记录中,firstname=instant只有一个电子邮件地址,我不想只删除一个唯一的电子邮件地址。这并不意味着每一个firstname=瞬间我都会有两个电子邮件地址。谢谢,我希望这能帮到我。最好的!注意,如果你没有OP的“即时”标志,这实际上会删除原件。如果您没有其他方法来判断“重复”记录是哪一条记录,这将无助于重复数据消除。
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