Mysql 删除所有具有重复值的行(只有一行除外)

Mysql 删除所有具有重复值的行(只有一行除外),mysql,sql,Mysql,Sql,我有一个包含三列的表:KEY、VALUE和LAST\u UPDATED 存在重复的值字段。我想删除所有与其他行具有相同值的行,但最近更新的行除外 因此,如果表中包含以下行: 1, "A", 2013-11-08 2, "B", 2013-10-30 3, "A", 2013-11-07 4, "A", 2013-11-01 5, "B", 2013-11-01 1, "A", 2013-11-08 5, "B", 2013-11-01 然后我只想保留这些行: 1, "A", 2013-11-

我有一个包含三列的表:KEY、VALUE和LAST\u UPDATED

存在重复的值字段。我想删除所有与其他行具有相同值的行,但最近更新的行除外

因此,如果表中包含以下行:

1, "A", 2013-11-08
2, "B", 2013-10-30
3, "A", 2013-11-07
4, "A", 2013-11-01
5, "B", 2013-11-01
1, "A", 2013-11-08
5, "B", 2013-11-01
然后我只想保留这些行:

1, "A", 2013-11-08
2, "B", 2013-10-30
3, "A", 2013-11-07
4, "A", 2013-11-01
5, "B", 2013-11-01
1, "A", 2013-11-08
5, "B", 2013-11-01

如何在SQL中实现这一点?我想象一下从表中删除,其中“按值从表组中选择键”(count*>1)中的键将从重复值中删除一个随机行,但如何使其删除除最近更新的行以外的所有行?

类似的操作应该可以:

DELETE t FROM myTable t
INNER JOIN
(
 SELECT VALUE,MAX(LAST_UPDATED) as mostRecent 
 FROM myTable 
 GROUP BY VALUE
 HAVING COUNT(*) > 1           
) t2 ON t.VALUE = t2.VALUE 
     AND t.LAST_UPDATED != t2.mostRecent;

您可以通过左连接执行此操作:

DELETE t
FROM table t
LEFT JOIN table t2 ON t.value = t2.value
AND t2.last_updated > t.last_updated
WHERE t2.key IS NOT NULL
这意味着对于每一行,它都会查找更新日期较新的另一行,如果有更新日期,则该行将被删除。您可能需要考虑执行日期差异,而不是使用大于来比较日期,因为它更可靠


在这种情况下,我希望左连接的性能比创建并连接到内联表要好得多,但如果性能是一个问题,那么最好尝试两种方法,并选择一种性能最稳定的方法。

好吧,我想问题是这样的。是否有一个字段可以让我们知道哪一个是最近更新的?在T-SQL中,您可以通过按“最近更新的描述”的顺序对行数进行多分区来做到这一点。只需尝试在MYSQL中使用类似的方法即可。@neoistheone最后更新的列可能重复@DMac您链接到的问题不会尝试保留特定的行,这就是为什么回答问题的SQL如此不同的原因。非常干净的解决方案我没有投反对票,但我更喜欢另一种解决方案,因为您的解决方案使用子查询,这是不必要的。只需做一个自连接,如collusionbdbh所示。懂我想我自己更喜欢左撇子的方式来想想吧。。。。