通过两列查找和删除重复的行

问题描述 投票:8回答:7

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

INSERT IGNORE INTO temp(MAILING_ID,REPORT_ID) 
SELECT DISTINCT MAILING_ID,REPORT_IDFROM table_1
;

问题是我想删除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)

但是它将所有行插入到临时文件中(包括重复项)

mysql sql indexing duplicate-removal
7个回答
25
投票

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

添加唯一索引:

ALTER IGNORE TABLE your_table ADD UNIQUE (field1,field2,field3);

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

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


8
投票

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


4
投票

您首先需要通过将两个字段中具有having子句分组来查找重复项。


2
投票

注意:此解决方案是替代方法和较旧的解决方案。


1
投票

您总是可以通过将两个唯一字段分组来获得主要ID


1
投票

对于Mysql:


0
投票

在大型数据集中,如果要在select子句中选择多个列,例如:select x,y,z from table1。并且要求是基于两列删除重复项:从上面的示例中,让y,z那么您可能会在下面使用而不是使用“分组依据”和“子查询”的组合,这会降低性能:

© www.soinside.com 2019 - 2024. All rights reserved.