Удаление дубликатов в MySQL
Украл статью отсюда
Для меня штука полезная очень. Пользуюсь последним методом
Оказывается, можно запросом с простым JOIN таблиц самой на себя:
DELETE t1 FROM sys_users t1, sys_users t2 WHERE t1.login=t2.login AND t1.ID > t2.ID
Этот запрос, если его соответствующим образом модифицировать, вполне будет работать и в MySQL, что меня, кстати, весьма удивило, ибо я ни разу не видел такого решения для удаления дубликатов, хотя нужда в этом действительно возникает достаточно часто. Обычно либо используют несколько запросов, создавая временные таблицы, либо тупо делают новую таблицу с помощью SELECT DISTINCT, потом переименовывают, удаляя старую, либо насильно навешивают уникальный ключ ALTER IGNORE TABLE table_name ADD UNIQUE INDEX (field_name) (при этом дубликаты удаляются автоматически).
На место ID нужно поставить любой уникальный ключ, который всегда есть в таблице. При этом не обязательно, чтобы ключ был автоинкрементный или вообще числовой, он вполне может быть и текстовым, сравнение «>» все равно будет работать. В общем виде запрос выглядит так:
DELETE table_name FROM table_name as table1,table_name as table2 WHERE table1.field_name=table2.field_name AND table1.unique_key>table2.unique_key
Я, правда, не уверен, что это будет работать во всех версиях MySQL, но у меня в 4й работает.
UPD: Тут реально удалял чуть более сложным запросом, понадобилось написать так:
DELETE table1 FROM zzz as table1,zzz as table2 WHERE table1.x=table2.x AND table1.y=table2.y AND table1.unique_id>table2.unique_id
Где zzz — имя таблицы, x и y — поля, которые мне надо было чтобы были парно уникальны. Основная разница с запросом, приведенным первым, в том, что пока не поставил «DELETE table1″ вместо «DELETE zzz» — не работало. Учтите.


Все работает до тех пор, пока количество записей в таблице не велико. Как только превышает 2к, сервер начинает задумыватся. Так же ограничением этого способа является невозможность составить дополнительное условие. Так что это не метод вовсе.
Для тех, у кого нет дополнительных условий и записей меньше 2к очень даже метод.
Использую очень редко. Не для регулярных «очисток»