Как проверить наличие дубликатов в таблице MySQL по нескольким столбцам - PullRequest
26 голосов
/ 23 июня 2011

У меня есть таблица игроков в бейсбол (все 1000 или около того) с полями:

mysql> describe person;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int(11)     | NO   | PRI | NULL    | auto_increment |
| firstname | varchar(30) | NO   |     | NULL    |                |
| lastname  | varchar(30) | NO   |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+

Но я думаю, что есть некоторые игроки, которые были добавлены дважды.Как я могу пройти и проверить, сколько вхождений конкретного имени, фамилии и комбо?

Ответы [ 6 ]

61 голосов
/ 23 июня 2011

Это обеспечивает список дубликатов:

SELECT firstname, lastname, COUNT(*) 
FROM person 
GROUP BY firstname, lastname 
HAVING COUNT(*) > 1;

Если вы хотите увидеть счетчики для каждой строки, удалите предложение, имеющее:

SELECT firstname, lastname, COUNT(*) 
FROM person 
GROUP BY firstname, lastname;
4 голосов
/ 23 июня 2011
SELECT firstname, lastname, count(id) count
  FROM person
 WHERE firstname = ?
   AND lasttname = ?
 GROUP BY firstname, lastname
2 голосов
/ 23 июня 2011

Для списка, отсортированного по убыванию значения количества копий:

SELECT firstname, lastname, COUNT(*) AS n
  FROM person
 GROUP BY firstname, lastname
 ORDER BY n DESC
 HAVING n > 1

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

1 голос
/ 06 октября 2015

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

SELECT em.* FROM employee_master AS em JOIN 
 (SELECT emp.login, emp.password, COUNT(*) 
  FROM employee_master emp 
  WHERE emp.login != '' AND emp.password != '' 
  GROUP BY emp.login, emp.PASSWORD
  HAVING COUNT(*) > 1
 ) AS dl 
WHERE em.login =  dl.login AND em.password = dl.password;
1 голос
/ 23 июня 2011

Если вы просто хотите стереть все дубликаты, вы можете создать временную таблицу и заполнить ее всеми вашими первичными таблицами.

Запрос на выборку данных с дубликатом будет следующим:

 SELECT DISTINCT firstname, lastname FROM table

Чтобы получить полный список данных в вашей таблице

SELECT firstname, lastname, COUNT(*) AS n
  FROM person
 GROUP BY firstname, lastname
 ORDER BY lastname DESC
 HAVING n > 1

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

1 голос
/ 23 июня 2011

Чтобы получить идентификаторы дубликатов имен, а также имена:

SELECT p1.id, p1.firstname, p1,lastname FROM person p1
INNER JOIN person p2 ON (p1.firstname = p2.firstname 
                         AND p1.lastname = p1.lastname 
                         AND p1.id <> p2.id); 
...