Попытка удалить повторяющиеся строки на основе хэша в MySQL

Я пытаюсь удалить повторяющиеся значения (которые будут иметь одинаковый nid) на основе хеш-значения.

Я собираюсь оставить начальную (самую старую) нидерскую строку с тем же хешем.

По какой-то причине я получаю сообщение об ошибке: «Вы не можете указать целевую таблицу« node_revision »для обновления в предложении FROM

Я пытаюсь использовать псевдонимы для моих таблиц, но это не работает – что я делаю неправильно?

delete from node_revision WHERE nid NOT IN(SELECT MIN(nid) FROM node_revision GROUP BY hash) 

(временная метка только для иллюстрации, на самом деле не хочу, чтобы это использовалось в любых запросах)

 | nid | hash | timestamp | | 2 | 123456 | 123364600 | | 2 | 123456 | 123364601 | | 2 | 1234567 | 123364602 | 

В этом случае выживут строки 1 и 3.

Вы можете использовать это как left join :

 delete nr from node_revision nr left join (SELECT MIN(nid) as minnid FROM node_revision GROUP BY hash ) nrkeep on nr.nid = nrkeep.minnid where nrkeep.minnid is null; 

Вы также можете «обмануть» MySQL в использовании подзапроса:

 DELETE FROM node_revision WHERE nid NOT IN (SELECT minnid FROM (SELECT MIN(nid) as minnid FROM node_revision GROUP BY hash ) t ); 

MySQL имеет хорошо документированное ограничение на использование измененной таблицы в update и delete . Этот запрос обходит ограничение, фактически материализуя список minnids, используя подзапрос.

РЕДАКТИРОВАТЬ:

Основываясь на следующем примере, вы должны использовать timestamp следующим образом:

 delete nr from node_revision nr left join (SELECT hash, nid, min(timestamp) as mintimestamp FROM node_revision GROUP BY hash ) nrkeep on nr.hash = nrkeep.hash and nr.nid = nrkeep.nid and nr.timestamp = nrkeep.mintimestamp where nrkeep.minnid is null;