删除mysql中所有重复的行

Posted

技术标签:

【中文标题】删除mysql中所有重复的行【英文标题】:Delete all duplicate rows in mysql 【发布时间】:2021-02-08 06:59:36 【问题描述】:

我有从 csv 文件导入的 mysql 数据,上面有多个重复文件,

我使用 Distinct 功能选择了所有非重复项。

现在我需要使用 SQL 命令删除所有重复项。

请注意,我不需要任何重复项,我只需要获取中午的重复项

谢谢。

例如,如果数字 0123332546666 重复 11 次,我想删除其中的 12 个。

Mysql表格式

ID, PhoneNumber

【问题讨论】:

【参考方案1】:

只需COUNT 重复的数量(使用GROUP BY)并按HAVING 过滤。然后将查询结果提供给DELETE 语句:

DELETE FROM Table1 WHERE PhoneNumber IN (SELECT a.PhoneNumber FROM (
  SELECT COUNT(*) AS cnt, PhoneNumber FROM Table1 GROUP BY PhoneNumber HAVING cnt>1
) AS a); 

http://sqlfiddle.com/#!9/a012d21/1

完整的小提琴: 架构:

CREATE TABLE Table1
    (`ID` int, `PhoneNumber` int)
;
    
INSERT INTO Table1
    (`ID`, `PhoneNumber`)
VALUES
    (1, 888),
    (2, 888),
    (3, 888),
    (4, 889),
    (5, 889),
    (6, 111),
    (7, 222),
    (8, 333),
    (9, 444)
;

删除查询:

DELETE FROM Table1 WHERE PhoneNumber IN (SELECT a.PhoneNumber FROM (
  SELECT COUNT(*) AS cnt, PhoneNumber FROM Table1 GROUP BY PhoneNumber HAVING cnt>1
) AS a); 

【讨论】:

【参考方案2】:

您可以尝试将左连接与子查询结合使用,以获取与每个不匹配的电话号码广告相关的最小 ID 删除

delete m 
from m_table m
left join  (
    select min(id), PhoneNumber
    from m_table  
    group by PhoneNumber
) t on t.id = m.id 
where t.PhoneNumber is null 

否则,如果您想删除所有重复项而不保留至少一行,您可以使用

delete m 
from m_table m
INNER join  (
    select PhoneNumber
    from m_table  
    group by PhoneNumber
    having count(*) > 1
) t on t.PhoneNumber= m.PhoneNumber 

【讨论】:

op 想要全部删除,所以 left 加入是不必要的 答案已更新以删除所有重复的行 观察一下,加入就够了【参考方案3】:

我建议不要从表中删除,而是创建一个新表:

create table table2 as 
    select min(id) as id, phonenumber
    from table1
    group by phonenumber
    having count(*) = 1;

为什么?删除行有很多开销。如果您从外部源引入数据,则将第一个登陆表视为临时表,第二个作为最终表。

【讨论】:

以上是关于删除mysql中所有重复的行的主要内容,如果未能解决你的问题,请参考以下文章

在pyspark中删除所有包含一个字母的行[重复]

Pandas:如何删除重复的行,但保留所有行的最大值[重复]

T-SQL:删除所有重复的行但保留一个[重复]

MySQL:删除所有超过 10 分钟的行

Mysql中的Delete操作

如何从mysql中的表中删除重复的行