Как проверить дубликаты в таблице mysql на несколько столбцов
У меня есть таблица бейсболистов (всего 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 | |
+-----------+-------------+------+-----+---------+----------------+
Но я думаю, что есть несколько игроков, которые добавлены дважды. Как я могу пройти и проверить, сколько вхождений определенного имени, фамилии комбо?
Ответы
Ответ 1
Здесь приведен список дубликатов:
SELECT firstname, lastname, COUNT(*)
FROM person
GROUP BY firstname, lastname
HAVING COUNT(*) > 1;
Если вы хотите, чтобы подсчеты для каждой строки удаляли предложение having:
SELECT firstname, lastname, COUNT(*)
FROM person
GROUP BY firstname, lastname;
Ответ 2
SELECT firstname, lastname, count(id) count
FROM person
WHERE firstname = ?
AND lasttname = ?
GROUP BY firstname, lastname
Ответ 3
Для списка, отсортированного по уменьшению количества копий:
SELECT firstname, lastname, COUNT(*) AS n
FROM person
GROUP BY firstname, lastname
ORDER BY n DESC
HAVING n > 1
Предложение HAVING
- это ключевая часть - необходимо отфильтровать результаты после предложения GROUP BY
, так как предложение WHERE
отфильтровывает строки до их группировки.
Ответ 4
Чтобы получить идентификатор повторяющихся имен, а также имена:
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);
Ответ 5
Если вы просто хотите стереть все дубликаты, вы можете сделать временную таблицу и заполнить ее всей вашей re data except the duplicate and them re-update you
re основной таблицей.
Запрос на выбор данных с дубликатом будет таким
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
С помощью этого последнего запроса вы получите список данных, отсортированных по фамилии по алфавиту.
Ответ 6
Чтобы найти дубликаты записей (например: найти имя пользователя и пароль для дублирования записей) в таблице, используйте следующий запрос:
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;