Под дублями можно иметь в виду разные условия. Возьмем как пример таблицу имен. В этой таблице есть повторяющиеся значения в поле 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
-ограничение на нужные поля.