我阅读了所有相关的重复问题/答案,发现这是最相关的答案:
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)
但是它将所有行插入到临时文件中(包括重复项)
删除多列重复行的最佳方法是最简单的方法:
添加唯一索引:
ALTER IGNORE TABLE your_table ADD UNIQUE (field1,field2,field3);
上面的IGNORE确保只保留找到的第一行,其余的被丢弃。
((如果您以后需要重复和/或知道它们不会再次发生,则可以删除该索引。)>
这在包括5.7+在内的任何MySQL版本中均能完美运行。它还通过使用双嵌套子查询来处理错误You can't specify target table 'my_table' for update in FROM clause
。它只会删除一个重复行(后一个),因此,如果您有3个或更多重复项,则可以多次运行查询。它never
您首先需要通过将两个字段中具有having子句分组来查找重复项。
注意:此解决方案是替代方法和较旧的解决方案。
您总是可以通过将两个唯一字段分组来获得主要ID
对于Mysql:
在大型数据集中,如果要在select子句中选择多个列,例如:select x,y,z from table1
。并且要求是基于两列删除重复项:从上面的示例中,让y,z那么您可能会在下面使用而不是使用“分组依据”和“子查询”的组合,这会降低性能: