Поиск повторяющихся значений в MySQL - PullRequest
706 голосов
/ 27 марта 2009

У меня есть таблица со столбцом varchar, и я хотел бы найти все записи с дублирующимися значениями в этом столбце. Какой лучший запрос я могу использовать, чтобы найти дубликаты?

Ответы [ 24 ]

1395 голосов
/ 27 марта 2009

Сделайте SELECT с предложением GROUP BY. Допустим, name - это столбец, в котором вы хотите найти дубликаты:

SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;

Будет возвращен результат со значением name в первом столбце и счетчиком того, сколько раз это значение появляется во втором.

210 голосов
/ 27 марта 2009
SELECT varchar_col
FROM table
GROUP BY varchar_col
HAVING COUNT(*) > 1;
155 голосов
/ 27 марта 2009
SELECT  *
FROM    mytable mto
WHERE   EXISTS
        (
        SELECT  1
        FROM    mytable mti
        WHERE   mti.varchar_column = mto.varchar_column
        LIMIT 1, 1
        )

Этот запрос возвращает полные записи, а не только отдельные varchar_column.

Этот запрос не использует COUNT(*). Если дубликатов много, COUNT(*) стоит дорого, и вам не нужен весь COUNT(*), вам просто нужно знать, есть ли две строки с одинаковым значением.

Наличие индекса на varchar_column, конечно, значительно ускорит этот запрос.

127 голосов
/ 19 февраля 2015

Построение ответа Левика для получения идентификаторов дублирующихся строк вы можете сделать GROUP_CONCAT, если ваш сервер его поддерживает (это вернет список идентификаторов через запятую).

SELECT GROUP_CONCAT(id), name, COUNT(*) c FROM documents GROUP BY name HAVING c > 1;
12 голосов
/ 22 мая 2014
SELECT * 
FROM `dps` 
WHERE pid IN (SELECT pid FROM `dps` GROUP BY pid HAVING COUNT(pid)>1)
11 голосов
/ 27 марта 2009

Предполагается, что ваша таблица называется TableABC, а столбец, который вам нужен, - это Col, а первичный ключ для T1 - это Key.

SELECT a.Key, b.Key, a.Col 
FROM TableABC a, TableABC b
WHERE a.Col = b.Col 
AND a.Key <> b.Key

Преимущество этого подхода перед приведенным выше ответом заключается в том, что он дает ключ.

9 голосов
/ 24 ноября 2015

Чтобы узнать, сколько записей являются дубликатами в столбце имени в Employee, полезен следующий запрос:

Select name from employee group by name having count(*)>1;
7 голосов
/ 25 января 2013
SELECT t.*,(select count(*) from city as tt
  where tt.name=t.name) as count
  FROM `city` as t
  where (
     select count(*) from city as tt
     where tt.name=t.name
  ) > 1 order by count desc

Замените город таблицей. Замените name именем вашего поля

7 голосов
/ 20 апреля 2018

Я не вижу никаких подходов JOIN, которые имеют много применений в плане дубликатов.

Этот подход дает вам реальные удвоенные результаты.

SELECT t1.* FROM my_table as t1 
LEFT JOIN my_table as t2 
ON t1.name=t2.name and t1.id!=t2.id 
WHERE t2.id IS NOT NULL 
ORDER BY t1.name
7 голосов
/ 05 мая 2017

Мой последний запрос включал несколько ответов, которые помогли - объединение групп по количеству & GROUP_CONCAT.

SELECT GROUP_CONCAT(id), `magento_simple`, COUNT(*) c 
FROM product_variant 
GROUP BY `magento_simple` HAVING c > 1;

Здесь указывается идентификатор обоих примеров (через запятую), нужный мне штрих-код и количество дубликатов.

Измените таблицу и столбцы соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...