Поиск одинаковых записей в MySQL

Как подсчитать количество одинаковых записей в MySQLИногда в базе данных бывает нужно подсчитать кол-во записей-дубликатов. Сделать это можно следующим способом:

SELECT * FROM table1 WHERE id IN 
(SELECT id FROM table1
 GROUP BY id HAVING COUNT(*)>1)

Давайте поподробнее разберем этот запрос. Нам нужно выявить записи с одинаковыми id в таблице table1, для этого нужно сделать выборку в таблице table1 с условием IN:

SELECT * FROM table1 WHERE id IN

что буквально означает «выбрать все из table1 где поле id равно диапазону значений». Последнее слово IN означает, что поле id должно быть равно не просто определенному значению, а соответствовать нескольким значениям, которые указываются в скобках после него. В нашем случае, в скобках после оператора IN указан подзапрос, который и возвращает все дублирующиеся id.

(SELECT id FROM table1 GROUP BY id HAVING COUNT(*)>1)

Как было сказано ранее, этот запрос возвращает значения id, которые повторяются более одного раза. «Выбрать id из table1, сгруппировать их и выбрать те, количество которых после группировки больше 1». Происходит группировка по полю id, и в мы как раз можем подсчитать кол-во «сгруппировавшихся» id-шников, т. е. количество одинаковых id. Так как группировка происходит по одному полю — id, то все одинаковые значения id будут сгруппированы в одно, то есть, например, у нас есть 3 айдишника со значением «1», еще 4 айди со значением «2», то есть всего 7 айдишников. В результате 3 айдишника сгруппируются в один, а еще 4 айдишника со значением «2» тоже сгруппируются в отдельную запись, и в результате после группировки мы получим два айдишника вместо 7-ми со значениями «1» и «2». С помощью оператора having и функции count мы можем посчитать кол-во сгруппированных id-шников, и если кол-во сгруппировавшихся id-шников больше 1, то мы учитываем их при выборке (т. е. учитываем их в операторе IN), например, из подзапроса мы узнали, что id-дубликаты — это 1 и 2. В основном запросе мы в итоге получим:

SELECT * FROM table1 WHERE id IN(1,2)

Бывает, что нужно найти записи, которые повторяются не по одному, а по нескольким полям. Допустим у нас есть таблица info с полями name и surname (имя и фамилия), нам нужно найти записи с двумя повторяющимися полями (name и surname). Для этого нам поможет оператор MySQL «CONCAT»:

SELECT * 
FROM info 
WHERE CONCAT( `info`.`name` , `info`.`surname` ) 
IN (
SELECT CONCAT( `info`.`name` , `info`.`surname` ) AS name2
FROM `info`
GROUP BY name2
HAVING COUNT( name2 ) >1
)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *