2010-06-09 8 views
1

Je voudrais sélectionner tous les enregistrements d'une table (names) où lastname n'est pas unique. De préférence, je voudrais supprimer tous les enregistrements qui sont des doublons.Sélectionnez un enregistrement qui a un doublon

Comment cela serait-il fait? Supposons que je voulez pas réexécuter une requête plusieurs fois jusqu'à ce qu'il se ferme.

+0

Lors de la suppression de doublons, y a-t-il un enregistrement particulier que vous souhaitez conserver? IE: Celui avec la plus faible valeur d'identification, etc? –

+0

@OMG P: Non, ce n'est pas grave. –

Répondre

2

La manière la plus rapide et la plus simple de supprimer des enregistrements en double est de lancer une commande très simple.

ALTER IGNORE TABLE [TABLENAME] AJOUTER INDEX UNIQUE UNIQUE_INDEX ([FIELDNAME])

Cela verrouille la table, si cela est un problème, essayez:

supprimer t1 de table1 t1, table2 t2
où table1.duplicate_field = table2.duplicate_field (ajouter si besoin par exemple. et table.duplicate_field2 = table2.duplicate_field2)
et table1.unique_field> table2.unique_field
et rupture dans des plages de courir plus vite

+0

Verrouiller la table n'est pas un problème. Le problème est là déjà des lignes en double. –

+0

Si le verrouillage n'est pas un problème, l'exécution de ALTER IGNORE TABLE [TABLENAME] AJOUTER UNIQUE INDEX UNIQUE_INDEX ([FIELDNAME]) reconstruira la table et supprimera les enregistrements en double. – Gary

+1

Vous ne pouvez pas appliquer une contrainte si les données ne le satisfont pas - votre suggestion ne fonctionnerait pas. –

3

Pour ce qui lastnames ont des doublons:

SELECT lastname, COUNT(lastname) AS rowcount 
    FROM table 
GROUP BY lastname 
    HAVING rowcount > 1 

Pour supprimer l'un des doubles de tous les noms de famille. Courir jusqu'à ce qu'il ne fasse rien. Pas très gracieux.

DELETE FROM table 
WHERE id IN (SELECT id 
       FROM (SELECT * FROM table) AS t 
      GROUP BY lastname 
       HAVING COUNT(lastname) > 1) 
+0

Maintenant, écrivez cela comme une suppression s'il vous plaît. :) –

+0

Je suis tenté de downvote simplement à cause de la deuxième requête merdique. Il doit sûrement y avoir un moyen plus simple de réexécuter une requête jusqu'à ce qu'elle s'arrête. –

0

dup How can I remove duplicate rows?

DELETE names 
FROM names 
LEFT OUTER JOIN (
    SELECT MIN(RowId) as RowId, lastname 
    FROM names 
    GROUP BY lastname 
) as KeepRows ON 
    names.lastname = KeepRows.lastname 
WHERE 
    KeepRows.RowId IS NULL 

hypothèse: vous avez une colonne RowId

+0

J'ai une colonne 'id'. –

0
SELECT COUNT(*) as mycountvar FROM names GROUP BY lastname WHERE mycountvar > 1; 

puis

DELETE FROM names WHERE lastname = '$mylastnamevar' LIMIT $mycountvar-1 

mais: pourquoi ne pas signaler que le fielt "nom de famille e "als unique, il n'est donc pas possible que les doublons peuvent entrer?

+0

Parce que les doublons sont déjà dans la table. J'essaie d'ajouter 'lastname' en tant que' UNIQUE INDEX'. –