MYSQL Удалить первые дубликаты из таблицы - PullRequest
8 голосов
/ 08 сентября 2011

У меня в таблице 511 дубликатов, мне нужно удалить их, но не оригиналы. Поэтому я хочу удалить каждое второе вхождение каждого дубликата.

Как я могу это сделать?

ТАБЛИЦА:

code  /   status  /   time
E3F4FF928A  /  0 /
07D95444BB  /  0 /  
07D95444BB /   0 / 
40006C128F  / 0  / 1315293012
2B45790E52   /  0  /
40006C128F  / 0  / 1315293012

Ответы [ 3 ]

9 голосов
/ 08 сентября 2011

добавить в таблицу столбца уникальный индекс, который должен быть уникальным, и игнорировать ошибки

alter ignore table X add unique index (column_a) 

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

5 голосов
/ 30 декабря 2011

Просто столкнитесь с этой проблемой сегодня (без уникального ключа в таблице).

Я решил ее так

DELETE FROM table where code=x and status=y and time=z LIMIT 1;

Это удалит первую 1 строку для заданных критериевесли у вас n дубликатов, поставьте n-1, чтобы оставить только один).

0 голосов
/ 08 сентября 2011
DELETE t2 FROM table1 t2 
INNER JOIN table1 t1 ON 
      (t1.somefield = t2.somefield 
   AND t1.otherfield = t2.otherfield   /*add more fields if need be */
   AND t2.id > t1.id)
LEFT JOIN table1 t3 ON 
      (t1.somefield = t3.somefield 
   AND t1.otherfield = t3.otherfield   /*add more fields if need be */
   AND t3.id > t2.id) 
WHERE (t3.id IS NULL)  
ORDER BY t2.id ASC

Это должно удалить только 2-й дубликат и оставить только 3-й и более дубликатов.

Если вы хотите что-то менее эзотерическое, и у вас есть столбец отметки времени, возможно, вы захотите сделать

DELETE t2 FROM table1 t2 
INNER JOIN table1 t1 ON 
      (t1.somefield = t2.somefield 
   AND t1.otherfield = t2.otherfield   /*add more fields if need be */
   AND t2.`timestamp` > t1.`timestamp`)
WHERE (1=1)        /*In some mode(s) MySQL requires a where clause with delete*/
ORDER BY t2.id ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...