按两列查找并删除重复的行

use*_*437 8 mysql sql indexing duplicate-removal

我阅读了所有相关的重复问题/答案,我发现这是最相关的答案:

INSERT IGNORE INTO temp(MAILING_ID,REPORT_ID) 
SELECT DISTINCT MAILING_ID,REPORT_IDFROM table_1
;
Run Code Online (Sandbox Code Playgroud)

问题是我想通过col1和col2删除重复项,但也想要插入table_1的所有其他字段.

我尝试以这种方式添加所有相关列:

INSERT IGNORE INTO temp(M_ID,MAILING_ID,REPORT_ID,
MAILING_NAME,VISIBILITY,EXPORTED) SELECT DISTINCT  
M_ID,MAILING_ID,REPORT_ID,MAILING_NAME,VISIBILITY,
EXPORTED FROM table_1
;


M_ID(int,primary),MAILING_ID(int),REPORT_ID(int),
MAILING_NAME(varchar),VISIBILITY(varchar),EXPORTED(int)
Run Code Online (Sandbox Code Playgroud)

但它将所有行插入temp(包括重复行)

gui*_*dod 25

删除多列重复行的最佳方法是最简单的方法:

添加UNIQUE索引:

ALTER IGNORE TABLE your_table ADD UNIQUE (field1,field2,field3);
Run Code Online (Sandbox Code Playgroud)

上面的IGNORE确保只保留第一个找到的行,其余的被丢弃.

(如果您需要将来重复和/或知道它们不会再次发生,您可以删除该索引).

  • 从MySQL 5.7.4开始,ALTER TABLE的IGNORE子句被删除,使用它会产生错误。 (4认同)
  • ALTER IGNORE 已被弃用 (3认同)
  • 在mysql 5.5中,可能存在一个错误。使用`set old_alter_table = 1`参见以下文档:https://dev.mysql.com/doc/refman/5.5/en/alter-table.html由于存在与快速索引创建相关的错误(错误#40344),ALTER IGNORE TABLE ... ADD UNIQUE INDEX不会删除重复的行。IGNORE关键字将被忽略。如果存在任何重复的行,则该操作将失败,并出现重复条目​​错误。解决方法是在运行ALTER IGNORE TABLE ... ADD UNIQUE INDEX语句之前设置old_alter_table = 1。 (2认同)

LSt*_*rky 8

这在包括5.7+在内的任何MySQL版本中均能完美运行。它还You can't specify target table 'my_table' for update in FROM clause通过使用双嵌套子查询来处理错误。它只会删除一个重复行(后一个),因此,如果您有3个或更多重复项,则可以多次运行查询。它从不删除唯一行。

DELETE FROM my_table
WHERE id IN (
  SELECT calc_id FROM (
    SELECT MAX(id) AS calc_id
    FROM my_table
    GROUP BY identField1, identField2
    HAVING COUNT(id) > 1
  ) temp
)
Run Code Online (Sandbox Code Playgroud)

我需要此查询,因为我想在两列上添加一个UNIQUE索引,但是有一些重复的行需要首先丢弃。

  • 请记住,如果 1+ 存在,它只会删除 1 个重复项。 (2认同)

Sco*_*tch 7

您首先需要通过使用having 子句对两个字段进行分组来查找重复项。

    Select identField1, identField2, count(*) FROM yourTable
        GROUP BY identField1, identField2
          HAVING count(*) >1
Run Code Online (Sandbox Code Playgroud)

如果这返回您想要的内容,您可以将其用作子查询并

  DELETE FROM yourTable WHERE field in (Select identField1, identField2, count(*) FROM yourTable
        GROUP BY identField1, identField2
          HAVING count(*) >1 )
Run Code Online (Sandbox Code Playgroud)

  • 如果表只有 2 列并且两列都被分组,如何防止删除所有重复项? (2认同)

小智 5

对于 MySQL:

DELETE t1 FROM yourtable t1 
  INNER JOIN yourtable t2 WHERE t1.id < t2.id 
    AND t1.identField1 = t2.identField1 
    AND t1.identField2 = t2.identField2;
Run Code Online (Sandbox Code Playgroud)