2010-10-13 23 views
2

J'ai une table avec des lignes comme id, longueur, temps et certains d'entre eux sont des doublons, où la longueur et l'heure sont les mêmes dans certaines lignes. Je veux supprimer toutes les copies de la première ligne soumise.Trouver des doublons ou plus dans Mysql, les supprimer sauf la première entrée

id | length | time 
01 | 255232 | 1242 
02 | 255232 | 1242 <- Delete that one 

J'ai ceci pour montrer tous les doublons dans la table.

SELECT idgarmin_track, length , time 
FROM `80dage_garmin_track` 
WHERE length in 
     (SELECT length 
     FROM `80dage_garmin_track` 
     GROUP 
     BY length 
     HAVING count(*) > 1) 
ORDER BY idgarmin_track, length, time LIMIT 0,500 

Répondre

4
DELETE FROM `80dage_garmin_track` t1 
WHERE EXISTS (SELECT 1 from `80dage_garmin_track` t2 
      WHERE t1.Length = t2.Length 
      AND t1.Time = t2.Time 
      AND t1.idgarmin_track > t2.idgarmin_track) 
+0

Thx pour la solution! Un problème, erreur suivante: "# 1064 - Vous avez une erreur dans votre syntaxe SQL, consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser 't1 WHERE EXISTS (SELECT 1 de' 80dage_garmin_track' t2 WHERE t1.Le 'à la ligne 1 "La requête fonctionne bien avec SELECT au lieu de DELETE – Holsteinkaa

+0

Une autre chose est, ce qui est t1 et t2? Variables? – Holsteinkaa

+0

t1 et t2 sont des alias.Il omis le mot-clé" AS ". Ils sont utilisés, de sorte que vous n'avez pas à écrire le nom de la table entière encore et encore – fancyPants

0

Si vous pouvez prendre votre table hors ligne pour une période, la façon la plus simple est de construire une nouvelle table contenant les données que vous voulez puis déposez la table d'origine:

create table `80dage_garmin_track_un` like `80dage_garmin_track`; 

insert into `80dage_garmin_track_un` 
select min(idgarmin_track), length, time 
group by length, time; 

rename table `80dage_garmin_track` to old, `80dage_garmin_track_un` to `80dage_garmin_track`; 

drop table old; 
0

J'ai le même problème Holsteinkaa, j'utiliser simplement comme ceci:

delete from table where id in (select * from (
    SELECT id FROM table t1 
    WHERE EXISTS (SELECT 1 from table t2 
     WHERE t1.field = t2.field 
     AND t1.id > t2.id 
    ) 
) as tmp) 

j'ai essayé de mettre cela comme un commentaire à Michael Pakhants ov réponse mais je ne peux pas:/désolé