Найти дубликаты или более в Mysql, удалить их, кроме первого ввода - PullRequest
2 голосов
/ 13 октября 2010

У меня есть таблица со строками, такими как id, длина, время, и некоторые из них являются дубликатами, где длина и время одинаковы в некоторых строках.Я хочу удалить все копии первой представленной строки.

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

У меня есть это, чтобы показать все дубликаты в таблице.

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

Ответы [ 3 ]

4 голосов
/ 13 октября 2010
 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 голосов
/ 05 января 2013

У меня та же проблема, Холстейнка, я просто использую это так:

 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 )

Я пытался поставить это как комментарий к ответу Михаила Паханцова, но я не могу: / извините

0 голосов
/ 13 октября 2010

Если вы можете перевести свою таблицу в автономный режим на определенный период, то самый простой способ - создать новую таблицу, содержащую нужные данные, а затем удалить исходную таблицу:

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;
...