根据一个列值删除重复的行

Jee*_*ppp 8 mysql sql

我有下表,现在我需要删除具有重复"refIDs"的行,但至少有一行与该ref,即我需要删除第4行和第5行.请帮我这个

+----+-------+--------+--+
| ID | refID |  data  |  |
+----+-------+--------+--+
|  1 |  1023 | aaaaaa |  |
|  2 |  1024 | bbbbbb |  |
|  3 |  1025 | cccccc |  |
|  4 |  1023 | ffffff |  |
|  5 |  1023 | gggggg |  |
|  6 |  1022 | rrrrrr |  |
+----+-------+--------+--+
Run Code Online (Sandbox Code Playgroud)

Mar*_*ams 15

这类似于Gordon Linoff的查询,但没有子查询:

DELETE t1 FROM table t1
  JOIN table t2
  ON t2.refID = t1.refID
  AND t2.ID < t1.ID
Run Code Online (Sandbox Code Playgroud)

这使用内部联接仅删除具有相同refID但ID较低的另一行的行.

避免子查询的好处是能够利用索引进行搜索.此查询应该与refID + ID上的多列索引一起使用.


小智 5

我会做:

delete from t where 
ID not in (select min(ID) from table t group by refID having count(*) > 1)
and refID in (select refID from table t group by refID  having count(*) > 1)
Run Code Online (Sandbox Code Playgroud)

标准是 refId 在重复项中,并且 ID 与重复项中的 min(id) 不同。如果 refId 被索引的话效果会更好

否则,前提是您可以多次发出以下查询,直到它不删除任何内容

delete from t 
where 
ID in (select max(ID) from table t group by refID  having count(*) > 1) 
Run Code Online (Sandbox Code Playgroud)


use*_*323 5

另一种变体,在某些情况下比 Marcus 和 NJ73 的答案快一点:

DELETE ourTable 
FROM ourTable JOIN 
 (SELECT ID,targetField 
  FROM ourTable 
  GROUP BY targetField HAVING COUNT(*) > 1) t2 
ON ourTable.targetField = t2.targetField AND ourTable.ID != t2.ID;
Run Code Online (Sandbox Code Playgroud)

希望这会对某人有所帮助。在大桌子上,马库斯回答摊位。

  • 注意:(从重复行中)保留的*哪个*行的ID在MySQL中没有*指定* - 因为`SELECT ID,targetField ..`可以从重复行中返回*任何*ID。如果a)您不关心保留哪一个重复行,或者b)您想要保留MySQL当前实现保留的行[可能是遇到的第一个,但一定要使用您的查询进行测试和MySQL版本]。 (2认同)