如何从mysql中删除重复数据(最新数据除外)

时间:2019-01-20 02:11:01

标签: mysql sql mysqli sql-delete delete-row

我要从delete表中mysql条记录

我有这样的桌子

我在这里检查(日期,URL,价格,酒店名称)是否相同,然后删除,除了一个

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 |

在此表中,您可以看到重复的记录是ID [1,4]和[5,6]

我想从该表中删除重复的记录,但最新数据除外

删除此表后的外观应为

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 |

2 个答案:

答案 0 :(得分:0)

如果表不是太大,这是一种简短直接的语法:

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
) 

答案 1 :(得分:0)

为此,我强烈推荐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;

我认为最晚的意思是“保留id最多的那个”。

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