web-dev-qa-db-fra.com

Comment vérifier les doublons dans la table mysql sur plusieurs colonnes

J'ai une table de joueurs de baseball (environ 1000), avec des champs:

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    |                |
+-----------+-------------+------+-----+---------+----------------+

Mais je pense que certains joueurs ont été ajoutés deux fois. Comment puis-je vérifier et vérifier combien d'occurrences d'un combo prénom, nom de famille particulier?

25
cfrederich

Ceci fournit la liste des doublons:

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

Si vous voulez voir les comptes pour chaque ligne, supprimez la clause having:

SELECT firstname, lastname, COUNT(*) 
FROM person 
GROUP BY firstname, lastname;
60
RC.
SELECT firstname, lastname, count(id) count
  FROM person
 WHERE firstname = ?
   AND lasttname = ?
 GROUP BY firstname, lastname
4
manji

Pour une liste triée par valeur décroissante du nombre de copies:

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

La clause HAVING est l'élément clé - il est nécessaire de filtrer les résultats après la clause GROUP BY, car une clause WHERE filtre les lignes avant elles sont groupées.

2
Alnitak

Pour obtenir les identifiants des noms en double ainsi que des noms, procédez comme suit:

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); 
1
Johan

Si vous voulez simplement effacer tous les doublons, vous pouvez créer une table temporaire et la remplir avec toute votre table primaire ___re data except the duplicate and them re-update youre.

La requête pour sélectionner les données avec dupliquer serait la suivante: 

 SELECT DISTINCT firstname, lastname FROM table

Pour obtenir la liste complète des données dans votre table 

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

Avec cette dernière requête, vous obtenez la liste des données triées par nom alphabétique.

1
PRacicot

Pour rechercher des enregistrements en double (par exemple, pour trouver le nom de connexion et le mot de passe des enregistrements en double) dans une table, utilisez la requête ci-dessous;

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
Naresh Chennuri