Удалить все повторяющиеся строки, кроме одного в MySQL?

Возможный дубликат:
Удалить повторяющиеся строки в MySQL

Как удалить все повторяющиеся данные из таблицы MySQL?

Например, со следующими данными:

SELECT * FROM names;
+----+--------+
| id | name   |
+----+--------+
| 1  | google |
| 2  | yahoo  |
| 3  | msn    |
| 4  | google |
| 5  | google |
| 6  | yahoo  |
+----+--------+

Я бы использовал SELECT DISTINCT name FROM names;, если это был запрос SELECT. Как мне сделать это с помощью DELETE, чтобы удалить только дубликаты и сохранить только одну запись?

Ответ 1

NB - вам нужно сделать это сначала на тестовой копии таблицы!

Когда я это сделал, я обнаружил, что, если я не включил AND n1.id <> n2.id, он удалил каждую строку в таблице.

1) Если вы хотите сохранить строку с наименьшим значением id:

DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name

2) Если вы хотите сохранить строку с наивысшим значением id:

DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name

Я использовал этот метод в MySQL 5.1

Не уверен в других версиях.

Обновление: поскольку пользователи Google для удаления дубликатов заканчиваются здесь
Хотя вопрос OP о DELETE, пожалуйста, имейте в виду, что использование INSERT и DISTINCT происходит намного быстрее. Для базы данных с 8 миллионами строк запрос ниже занимает 13 минут, а при использовании DELETE прошло более 2 часов, но не завершилось.

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
    SELECT DISTINCT cellId,attributeId,entityRowId,value
    FROM tableName;

Ответ 2

Если вы хотите сохранить строку с самым низким значением id:

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MIN(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

Если вы хотите, чтобы значение id было самым высоким:

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MAX(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

Подзапрос в подзапросе необходим для MySQL, или вы получите ошибку 1093.