Как удалить дубликаты из таблицы в MySQL

Под дублями можно иметь в виду разные условия. Возьмем как пример таблицу имен. В этой таблице есть повторяющиеся значения в поле name. Разберём практический способ удалить такие записи в MySQL с помощью одного SQL-запроса.

Пример исходной таблицы

Пусть у нас есть таблица people:

Видно, что ‘Петя’ встречается 2 раза, а ‘Вася’ — целых три.

Запрос для удаления дублей

В MySQL можно использовать конструкцию DELETE … USING:

Как это работает

  1. В подзапросе SELECT MAX(id) … GROUP BY name выбирается максимальный id для каждой группы строк с одинаковым name.
  2. Условие HAVING COUNT(*) > 1 оставляет только те группы строк, где действительно есть дубликаты.
  3. Основной запрос удаляет из таблицы people записи, у которых id совпадает с найденными в подзапросе.

Таким образом, для каждого дубликата удаляется строка с наибольшим id, а более «старые» строки остаются.

Что делать, если дублей больше двух

После выполнения запроса будут удалены по одному дублю из каждой группы. Т.е. ‘Вася’ всё также будет с дублем, но таких строк останется всего две.

Чтобы избавиться от дублей полностью, запрос нужно выполнять несколько раз, пока MySQL не вернёт affected rows = 0. Это будет означать, что больше дублей не осталось.


Для удаления дублей в MySQL можно использовать короткий и понятный приём через DELETE … USING с подзапросом на GROUP BY. Он удобен для «ручных» разовых чисток таблиц. А чтобы больше не сталкиваться с этой проблемой, стоит сразу добавить UNIQUE-ограничение на нужные поля.

Мало букафф? Читайте есчо !

Нумеруем строки в результатах mySQL

Март 6, 2019 г.

Для mySQL 8й версии эта статья не актуальна, т.к. там появилась целая серия замечательных функций, в том числе ROW_NUMBER(). Но пока на значительном количестве хостингов используется 5я версия. Приём прост: требуется объявить переменную и инкрементировать ...

Читать

Получить разницу дат в секундах в MySQL

Июнь 15, 2018 г.

Для начала выберем функцию с подходящей гранулярностью. DATEDIFF явно не подходит, т.к. даёт разницу в кол-ве целых дней. К счастью, есть аналогичная функция - TIMEDIFF, которая вычисляет разницу с точностью до микросекунд. Результат работы TIMEDIFF ...

Читать

Ошибка MySQL Incorrect datetime value: '0000-00-00 00:00:00'

Февраль 16, 2023 г.

Появляется, если поле типа datetime уже содержит подобные нулевые значения при попытке изменить как тип поля (через alter table), так и сами значения в таблице. Вероятно ошибка возникает, если вы импортировали данные в вашу базу. Скорее всего из-за ...

Читать

Аналог strpos в mySQL

Февраль 4, 2019 г.

Недавно обнаружил, что в mySQL целых три аналога PHP функции strpos. INSTR(str,substr) - возвращает индекс первого найденного совпадения substr ...

Читать
 

Комментарии к «Как удалить дубликаты из таблицы в MySQL»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: