Как удалить дубликаты из таблицы в 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

Октябрь 18, 2010 г.

Иногда нужно выбрать строки из базы данных в случайном порядке. При сайтостроительстве эта задача возникает довольно часто - вывести случайную тему из форума, показать в блоке случайный продвигаемый товар, показать случайный ответ посетителя за последнюю ...

Читать

Как получить номер строки в MySql?

Ноябрь 5, 2016 г.

Что делать, если нужно пронумеровать строки прямо в запросе? Полистав руководство MySql 5.5, нужной функции я не нашел. Мне нужно было сохранять позиции пользователей в рейтинге, т.е. пронумеровать пользователей в зависимости от значения их рейтинга. ...

Читать

Как изменить значение AUTO_INCREMENT таблицы в MySQL

Август 3, 2022 г.

Наиболее простой ответ - это использование запроса alter, где вы задаёте новое значение для AUTO_INCREMENT нужной вам таблицы: [crayon-68d4dac7ccec8778117307/] Вы можете достичь такого же эффекта изменениями соответствующего столбца вашей таблицы: ...

Читать

Нумерация при выборке строк в mySQL

Апрель 24, 2023 г.

В MSSQL есть функция ROW_NUMBER(), которая нумерует строки выборки. В MySQL такой функции пока нет, но мы можем использовать трюк с переменными для достижения нужного эффекта. К примеру, вы хотите выбрать название книг и пронумеровать список. Изначально ...

Читать
 

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

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



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