我要从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 |
答案 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 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;
我认为最晚的意思是“保留id最多的那个”。
如果您有大量数据,delete
可能会很昂贵。在这种情况下。 create temporary table
/ truncate
/ insert
可能会有更好的性能。