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

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

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

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

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

谢谢。

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

Mysql表格式

ID, PhoneNumber

【问题讨论】:

    标签: mysql sql phpmyadmin


    【解决方案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;
      

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

      【讨论】:

        猜你喜欢
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 2011-04-16
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多