如何从 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 by
和 join
:
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
可能会有更好的性能。
我想 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 by
和 join
:
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
可能会有更好的性能。