Хочу удалить дубликаты строк.
Различается только поле id (автоинкремент).
Пробовал составить несколько разных "NOT IN" и "NOT EXIST" конструкций, но все они выдают ошибку синтаксиса. Видимо хреновый я составитель запросов. Какими запросами для удаления дубликатов вы пользуетесь?
Для правильного вопроса надо знать половину ответа
DELETE `t1`.* FROM `table` AS `t1`
LEFT JOIN (SELECT `id` FROM `table` GROUP BY `field1`, `field2`, ...) AS `t2`
ON `t1`.`id` = `t2`.`id`
WHERE `t2`.`id` IS NULL
AleDv: SELECT группирует все строки таблицы по полям, так что для каждой группы одинаковых строк будет выдан id только какой-то одной из этих строк.
LEFT JOIN дописывает id из выборки к строкам таблицы, помечая таким образом уникальные строки
DELETE удаляет строки с id, не попавшими в выборку, то есть все непомеченные дубликаты строк.
Пример:
id name age
1 Вася 17
2 Петя 21
3 Вася 17
4 Миша 19
5 Миша 19
Как я уже говорил, хреновый я составитель запросов. Но мне кажется, что в этом случае будут удалены не только дубликаты, но и поля не имеющие дубликатов.
Нет, все будет пучком.
Внутренний запрос отберет все ID записей:
* Для одной - это текущая запись
* Для нескольких - максимальная
А потом удалит все остальные ID, которые не подходят под этот набор
@pihel почему несколько раз? вы внутренний подзапрос выполните отдельно, он вам вернет все ID у которых число дубликов, более 1. 1 раз надо выполнить запрос.
Честно сказать - не знаю. Думал тут проблем не будет.
Попробуйте создать псевдонимы.
Может у вас 4 версий mysql? Вроде в ней нельзя удалять записи используя подзапросы bugs.mysql.com/bug.php?id=5037
Если так, то получается надо создавать временную таблицу для хранения ID или делать удаление на стороне серверного кода.