如何从 MySQL 中删除除最新数据之外的重复数据

How to delete duplicate data from MySQL except latest data

我想 delete 来自 mysql table

的记录

我有table这样的

我正在检查如果 (date, url, price, hotelName) 相同然后删除除了一个

id | hotelName | price | url      | date        |
-------------------------------------------------
1  | abcd      | 20$   | abcd.com | 21 jan 2019 |
2  | abcd      | 24$   | abcd.com | 22 jan 2019 |
3  | wzyz      | 10$   | wzyz.com | 21 jan 2019 |
4  | abcd      | 20$   | abcd.com | 21 jan 2019 |
5  | wzyz      | 15$   | wzyz.com | 22 jan 2019 |
6  | wzyz      | 15$   | wzyz.com | 22 jan 2019 |

在这个table你可以看到重复的记录是id [1,4]和[5,6]

我想从此 table 中删除重复记录,除了最新数据

删除后 table 应该看起来像

id | hotelName | price | url      | date        |
-------------------------------------------------
2  | abcd      | 24$   | abcd.com | 22 jan 2019 |
3  | wzyz      | 10$   | wzyz.com | 21 jan 2019 |
4  | abcd      | 20$   | abcd.com | 21 jan 2019 |
6  | wzyz      | 15$   | wzyz.com | 22 jan 2019 |

如果您的 table 不是太大,这是一个简短直接的语法:

DELETE t1 
FROM 
    mytable t1 
    CROSS JOIN t2 
WHERE 
    t1.id < t2.id 
    AND t1.hotelName = t2.hotelName 
    AND t1.date      = t2.date
    AND t1.url       = t2.url
    AND t1.price     = t2.price

另一种解决方案,资源消耗较少:

DELETE FROM mytable
WHERE id NOT IN (
    SELECT MAX(t.id) FROM mytable t GROUP BY t.hotelName, t.date, t.url, t.price
) 

为此,我强烈推荐 group byjoin

delete t join
       (select date, url, price, hotelName, max(id) as max_id
        from t
        group by date, url, price, hotelName
       ) tt
       using (date, url, price, hotelName)
    where t.id < tt.max_id;

我假设你的意思是 "keep the one with the largest id"。

如果您有大量数据,delete 可能会很昂贵。在这种情况下。 create temporary table/truncate/insert 可能会有更好的性能。