2011-05-09 94 views
4

我有一个列表ID,firstname,lastname,address,email等。从MYSQL表中删除重复的电子邮件地址

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

(从评论)其他信息:

如果有两行具有相同email地址一个将有一个正常的firstnamelastname但对方必须在firstname“即时”。所以我可以区分它们。我只想删除名为'instant'的人。

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

请帮我一把。

+0

您打算如何处理该行的其余部分?如果你有两个名字相同的电子邮件地址,你会怎么做?你是否删除了*重复的电子邮件,或只有一个?你如何决定哪个? – forsvarir 2011-05-09 11:01:30

+0

如果有两个相同的电子邮件地址,则可以使用正常的名字和姓氏,但其他名字在名字中会有“即时”。所以我可以区分它们。我只想删除名为“instant”的那个。 – fawad 2011-05-09 11:03:13

+0

为什么不直接删除firstname ='Instant''? – forsvarir 2011-05-09 11:08:56

回答

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' 
+0

谢谢,我希望这会帮助我。最好 ! – fawad 2011-05-09 11:30:50

+0

太棒了,它为我工作。 – fawad 2011-05-09 11:46:57

+4

**当心**,如果您没有OP的“即时”标志,这实际上会删除原件。如果您没有其他方式来确定哪个“重复”记录,这不会帮助您进行重复数据删除。 – 2015-10-29 19:47:25

0
  • 复制表结构
  • 将唯一的密钥对新表(只是为了安全)
  • 的电子邮件由电子邮件地址,请在从旧的一个分组中的新表中选择数据的INSERT
+0

如果你不介意告诉我在mysql中执行所有这3个步骤的步骤。我只是初学者。 – fawad 2011-05-09 10:58:43

+0

您不能仅通过电子邮件地址进行分组。 'select'子句中的所有内容都必须位于'group by'子句中。如果说'地址'(表格中的另一列)有一个额外的空间,这是如何工作的?你仍然有两行,但第二个将失败插入(我期望在同一语句中的任何其他插入)。这可能会做OP的要求(如果正确实施),但它似乎是一个不好的解决方案... – forsvarir 2011-05-09 11:07:20

+0

你是对的。这是不好的编程习惯,我允许重复的电子邮件地址发出命令。现在我感觉他们遇到了问题。 – fawad 2011-05-09 11:10:22

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

获取一组唯一的现有行。当然,你仍然需要整理所有的记录(提示 - 这就是上述查询没有返回的IDs ni客户表)。

+0

你是对的,我不在乎我保留的记录 – MiPnamic 2011-05-09 12:04:58

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

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

+0

这很适合我的情况。 – 2015-10-29 19:57:41

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

非常好的解决方案,像魅力一样工作! – AlanRezende 2017-06-15 17:34:23

相关问题