从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