2010-09-16 4 views
0

J'ai regardé autour de moi mais je n'ai pas réussi à trouver une solution, alors j'espère que quelqu'un pourra m'aider.Supprimer les entrées en double de la base de données avec les conditions

J'ai une table MySQL des résultats d'une application d'enregistrement interne qui enregistre un résultat d'un contrôle de routine, il y a un certain nombre de routines de contrôle qui sont identifiés à la colonne de suivi:

id (int)(PK), tracker (int), time (timestamp), result (int) 

Un seul résultat doit être enregistré si le résultat précédent n'est pas le même, seules les modifications doivent être capturées. Malheureusement, cela a été ignoré quand il a été construit (pressé) il y a un mois et les résultats ont été enregistrés à l'aveugle sans aucun contrôle sur les résultats précédents. Cela a maintenant été enregistré mais il me reste encore quelques milliers de lignes dont un nombre significatif sont des doublons et je suis en train de les effacer pour laisser les points de changement.

Je dois donc parcourir chaque ligne, regarder le résultat précédent enregistré par ce tracker et supprimer la ligne si c'est la même chose, c'est un peu au-delà de mon expérience avec MySQL et les tentatives que j'ai faites jusqu'ici été assez pauvre!

Quelqu'un peut-il aider?

Répondre

2

Utilisation:

DELETE a 
    FROM YOUR_TABLE a 
LEFT JOIN (SELECT MAX(t.id) AS latest_id 
      FROM YOUR_TABLE t 
     GROUP BY t.tracker, t.result) b ON b.latest_id = a.id 
    WHERE b.latest_id IS NULL 

Autre utilisant IN:

DELETE FROM YOUR_TABLE 
WHERE id NOT IN (SELECT x.latest_id 
        FROM (SELECT MAX(t.id) AS latest_id 
          FROM YOUR_TABLE t 
         GROUP BY t.tracker, t.result) x) 
+0

Top a fait ce que je voulais, réduit le nombre de lignes d'environ 90%, ce qui devrait certainement accélérer les requêtes et les sauvegardes. Merci beaucoup! – Duncan

+1

Pourquoi avez-vous besoin de la sous-requête wrapper x dans la deuxième requête suggérée? – MattSmith

+1

@MattSmith: Sans le wrapper, vous obtiendrez une erreur MySQL # 1093 concernant le référencement de la table qui est en train de muter. –

0

Il y a des plaintes que c'est lent à exécuter, mais cela ne vous affecte probablement pas. Il sera certainement plus rapide que tout ce que vous pourriez faire:

select DISTINCT id, tracker, time, result 
from table; 
+0

J'ai besoin d'enregistrer toutes les modifications apportées aux résultats afin que cela ne fonctionne pas malencontreusement. – Duncan

0

Je pense que vous voulez un index unique sur la table:

ALTER IGNORE TABLE table ADD UNIQUE INDEX (tracker, time, result)

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

Vous devez utiliser INSERT IGNORE... lors de l'ajout de nouvelles lignes comme inserts qui feraient double emploi avec une clé existante (tracker, temps, résultat) provoquera une erreur.

+0

Ce n'est pas explicitement indiqué, mais l'OP lit comme si c'était prévu ... mais vous ne pouvez pas appliquer la contrainte tant que les données ne la satisfont pas. Et les états d'OP veulent SUPPRIMER les doublons ... –

+0

J'avais des pensées le long de ces lignes pour l'enregistrement futur mais un résultat capturé quelques minutes après qu'un autre produise toujours une nouvelle rangée même si le résultat est le même que le temps est différent sûrement? – Duncan

Questions connexes