как удалить дубликаты данных из MySQL, кроме последних данных - PullRequest
0 голосов
/ 20 января 2019

я хочу delete записей из mysql таблицы

у меня есть такая таблица

я проверяю здесь, если (дата, URL, цена, 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 |

, в этой таблице вы можете увидеть дублирующиеся записи с идентификатором [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 голосов
/ 20 января 2019

Я настоятельно рекомендую 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;

Полагаю, самое последнее, вы имеете в виду "сохранить тот, у кого самый большой идентификатор".

Еслиу вас большой объем данных, delete может быть дорогим.В таком случае.create temporary table / truncate / insert может иметь лучшую производительность.

0 голосов
/ 20 января 2019

Если ваша таблица не слишком большая, это короткий и прямой синтаксис:

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
) 
...