MySQL выявление, подсчет и удаление записей с повторяющимися полями

Выявить и подсчитать записи с дублирующимися полями в субд MySQL можно двумя способами: используя группировку по полю и оператор HAVING либо используя SELECT подзапрос. Рассмотрим оба способа, но сразу скажу, GROUP BY + HAVING отработает на порядок эффективнее и именно её будем использовать при выявлении дублей, да и вообще лучше использовать именно этот способ. В обеих случаях проверяемому полю добавим простой индекс, если его ещё нет.

1.  Вариант нахождения дублирующихся записей с подзапросом SELECT выглядит так:

На таблицах миллионниках такой способ будет мало эффективен, поскольку в подзапросе перебирается каждая запись.

2.  Более эффективный способ выявить повторяющиеся поля в MySQL выглядит так:

Предположим у нас есть поле date_created, тогда мы можем сгруппировать данные по времени, выявив в какие периоды вносилось наибольшее число дублей, тут уже без подзапросов тоже не обойтись:

Здесь мы уже в подзапросе отнимаем единичку, чтобы получить не просто кол-во повторяющихся записей, а именно записей — чистых дублей указанного поля field_name

Удалять повторяющиеся записи из бд будем при помощи ALTER IGNORE

Одновременно будет добавлен уникальный индекс целевому полю.

Тоже самое можно сделать и по нескольким столбцам:

Более гибкий вариант удалить повторяющиеся записи mysql — использование временной таблицы. Тут мы уже сможем поиграть с условиями как нам нужно:

Однако в данном примере DISTINCT указывает на все поля, т.е. выбираются уникальные записи на основе всех полей(по факту группирует по ним). Но вполне вероятно, что все поля в сумме и так у нас уникальны, поскольку имеют например, уникальный id и/или время. В таком случае использование DISTINCT неуместно. Мы просто сгруппируем по нужному полю, и согласно логике работы GROUP BY занесутся лишь первые попавшиеся под группировку записи.

 

Оставить комментарий

Ваш адрес email не будет опубликован.