Пусть существует таблица users с полями user_id и user_name, и в ней имеются записи с одниковыми значениями user_name. Запрос удаления "лишних" строк будет выглядеть, допустим, так:
DELETE FROM users WHERE user_id IN
(SELECT user_id FROM users WHERE user_name IN
(SELECT user_name FROM
(SELECT user_id, COUNT(*) AS cnt, user_name FROM users GROUP BY user_name HAVING cnt>1) AS t1
)
AND user_id NOT IN (SELECT user_id FROM users GROUP BY user_name)
)
Или так:
DELETE FROM users WHERE user_id IN
(SELECT t1.user_id FROM
(SELECT user_id, user_name FROM users) AS t1
INNER JOIN
(SELECT user_name, COUNT(*) AS cnt, MIN(user_id) AS min_id FROM users GROUP BY user_name HAVING cnt > 1) AS t2
ON t1.user_name=t2.user_name AND t1.user_id!=t2.min_id
)
В общем, как ни крути, получается, по сути, два вложенных селекта, и время работы, по идее, соответственно, в два раза больше, хотя если бы можно было обратиться к результату t1 после AND в первом примере, то было бы более по фэншую, наверно (а так костыли какие-то). Можно ли как-то это исправить?
И второе, почему-то на указанные выше примеры SQLyog ругается:
Error Code: 1093
You can't specify target table 'users' for update in FROM clause
Английский у меня хромает, но, насколько я понял, оно утверждает, что я не могу отправить в команду удаления результат вложенного запроса!? О_о
P.S. Сильно не ругайте, sql не вспоминал ещё со школьных лет...