Под дублями можно иметь в виду разные условия. Возьмем как пример таблицу имен. В этой таблице есть повторяющиеся значения в поле name. Разберём практический способ удалить такие записи в MySQL с помощью одного SQL-запроса.
Пример исходной таблицы
Пусть у нас есть таблица people:
| 
					 1 2 3 4 5 6 7 8  | 
						id | name ---+------ 1  | Вася 2  | Петя 3  | Вася 4  | Оля 5  | Петя 6  | Вася  | 
					
Видно, что ‘Петя’ встречается 2 раза, а ‘Вася’ — целых три.
Запрос для удаления дублей
В MySQL можно использовать конструкцию DELETE … USING:
| 
					 1 2 3 4 5 6 7 8 9  | 
						DELETE FROM people USING people,      (        SELECT MAX(id) AS id, name, COUNT(*)        FROM people        GROUP BY name        HAVING COUNT(*) > 1      ) AS lastTwin WHERE people.id = lastTwin.id;  | 
					
Как это работает
- В подзапросе 
SELECT MAX(id) … GROUP BY nameвыбирается максимальныйidдля каждой группы строк с одинаковымname. - Условие 
HAVING COUNT(*) > 1оставляет только те группы строк, где действительно есть дубликаты. - Основной запрос удаляет из таблицы 
peopleзаписи, у которыхidсовпадает с найденными в подзапросе. 
Таким образом, для каждого дубликата удаляется строка с наибольшим id, а более «старые» строки остаются.
Что делать, если дублей больше двух
После выполнения запроса будут удалены по одному дублю из каждой группы. Т.е. ‘Вася’ всё также будет с дублем, но таких строк останется всего две.
Чтобы избавиться от дублей полностью, запрос нужно выполнять несколько раз, пока MySQL не вернёт affected rows = 0. Это будет означать, что больше дублей не осталось.
Для удаления дублей в MySQL можно использовать короткий и понятный приём через DELETE … USING с подзапросом на GROUP BY. Он удобен для «ручных» разовых чисток таблиц. А чтобы больше не сталкиваться с этой проблемой, стоит сразу добавить UNIQUE-ограничение на нужные поля.
