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确保只保留第一个找到的行,其余的被丢弃.
(如果您需要将来重复和/或知道它们不会再次发生,您可以删除该索引).
这在包括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索引,但是有一些重复的行需要首先丢弃。
您首先需要通过使用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)
小智 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)
| 归档时间: |
|
| 查看次数: |
16688 次 |
| 最近记录: |