Как найти дубликаты в MySQL

По работе столкнулся с проблемой: некоторые объекты на карте имели одинаковые координаты. Это приводило к ошибке кластеризации на Яндекс.Картах. Чтобы исправить данную проблему, мне понадобилась функция поиска дубликатов в таблице MySQL. Найденные координаты нужно было исправить, чтобы они немного отличались (например, если объекты находятся в одном доме, их можно разнести по разным подъездам этого дома).

Дубликаты одного поля

Найти дубликаты переменной x в таблице table_name:

SELECT * FROM table_name WHERE x IN(SELECT x FROM table_name GROUP BY x HAVING COUNT(x)>1) ORDER BY x

Эта функция ищет дубликаты только одного поля. Если нужно сравнивать несколько полей, например, координаты (x,y) или (имя,фамилия,отчество) — принцип тот же. Насколько я понял, умных алгоритмов для поиска дубликатов в MySQL нет, поэтому мы просто объединяем нужные поля в одно слово командой z=CONCAT(a,b,c ....) — и ищем дубликаты по переменной z.

Дубликаты нескольких полей

Найти дубликаты пар (x,y) в таблице table_name:

SELECT * FROM table_name WHERE CONCAT(x,y) IN (SELECT CONCAT(x,y) AS z FROM table_name GROUP BY z HAVING COUNT(z)>1)

В скобках может быть указано любое кол-во полей.

Дополнительные условия

В моём случае нужно дополнительно исключить ситуации с нулевыми координатами (это ещё не заполненные поля):

SELECT * FROM table_name WHERE CONCAT(x,y) IN (SELECT CONCAT(x,y) AS z FROM table_name WHERE x!=0 AND y!=0 GROUP BY z HAVING COUNT(z)>1)

5 мартаMySQL

Заметка понравилась? → Поделитесь в соцсетях:

Ваш комментарий

comments powered by HyperComments

Следующая заметка

Иван ТитовИван Титов
Фрилансер, музыкант, физтех по жизни, семьянин, философ.
© 2017