- Создайте запрос A, в котором вы получите строки, которые квалифицируются как дубликаты
- Создайте запрос B, который вернет вам строки, которые вы хотите сохранить
- Сделать запрос, который удаляет все строки, которые находятся в A, но не в B.
Пример.
Предполагается, что таблица с именем table
со столбцом идентификатора автоинкремента с именем id
и столбцом с именем name
, из которого вы хотите удалить двойные числа. Из каждого имени вы хотите сохранить самую старую запись (ту, у которой самый низкий идентификатор).
Запрос A выглядит примерно так:
SELECT * FROM table
WHERE name IN (SELECT name FROM table GROUP BY name HAVING COUNT(*) > 1)
Запрос B будет:
SELECT * FROM table
WHERE id IN (SELECT min(id) FROM table GROUP BY name)
Теперь объедините их, чтобы сформировать запрос на удаление:
DELETE FROM table
WHERE name IN (SELECT name FROM table GROUP BY name HAVING COUNT(*) > 1)
AND NOT id IN (SELECT min(id) FROM table GROUP BY name)
В данном примере вы могли бы пропустить первый запрос, но когда все усложняется, это хорошая дополнительная защита.