2009-10-15 9 views
2

Supposons que j'ai plusieurs colonnes. Si 2 colonnes correspondent et sont exactement les mêmes, elles sont des doublons. Supposons que si le lien et la taille sont similaires pour 2 lignes ou plus, alors ces lignes sont des doublons. Comment puis-je obtenir ces doublons dans une liste et les traiter?Comment trouver des doublons dans MySQL

+0

qu'avez-vous essayé? – SilentGhost

Répondre

7

retournera tous les enregistrements qui ont dups:

SELECT theTable.* 
FROM theTable 
INNER JOIN (
    SELECT link, size 
    FROM theTable 
    GROUP BY link, size 
    HAVING count(ID) > 1 
) dups ON theTable.link = dups.link AND theTable.size = dups.size 

J'aime la sous-requête b/c je peux faire des choses comme tout sélectionner, mais le premier ou le dernier. (très facile à transformer en une requête de suppression alors).

Exemple: sélectionner tous les enregistrements en double, sauf celui avec l'ID max:

SELECT theTable.* 
FROM theTable 
INNER JOIN (
    SELECT link, size, max(ID) as maxID 
    FROM theTable 
    GROUP BY link, size 
    HAVING count(ID) > 1 
) dups ON theTable.link = dups.link 
      AND theTable.size = dups.size 
      AND theTable.ID <> dups.maxID 
1

En supposant qu'aucun des id, lien ou taille peut être NULL, et id champ est la clé primaire. Cela vous donne l'ID des lignes en double. Méfiez-vous que le même identifiant peut figurer dans les résultats plusieurs fois, s'il y a trois lignes ou plus avec des valeurs de lien et de taille identiques.

select a.id, b.id 
from tbl a, tbl b 
where a.id < b.id 
    and a.link = b.link 
    and a.size = b.size 
0

Si vous voulez le faire exclusivement dans SQL, une sorte d'auto-jointure de la table (sur l'égalité des link et size) est nécessaire, et peut être accompagné de différents types d'élaboration. Puisque vous mentionnez aussi Python, je suppose que vous voulez faire le traitement en Python; dans ce cas, le plus simple est de construire un itérateur sur un lien 'SELECT * FROM thetable ORDER BY, taille , and process with itertools.groupby using, as key, the operator.itemgetter` pour ces deux champs; ceci présentera des regroupements naturels de chaque groupe de 1+ lignes avec des valeurs identiques pour les champs en question.

Je peux élaborer sur l'une ou l'autre option si vous clarifiez où vous voulez faire votre traitement et, idéalement, fournissez un exemple du type de traitement que vous voulez effectuer!

+1

Je veux trouver les lignes qui sont des «doublons» en fonction de certains attributs. Ensuite, je veux calculer la ligne "importante", et supprimer/mettre à jour le score de la ligne "duplicate"! Wow, vous avez écrit Python Cookbook !!! ??? Je l'ai sur mon bureau maintenant – TIMEX

1

Après avoir supprimé les doublons de la table MySQL, vous pouvez ajouter un index unique à la table donc pas plus de doublons peuvent être insérés:

create unique index theTable_index on theTable (link,size); 
Questions connexes