DELETE t2 FROM table1 t2
INNER JOIN table1 t1 ON
(t1.somefield = t2.somefield
AND t1.otherfield = t2.otherfield /*add more fields if need be */
AND t2.id > t1.id)
LEFT JOIN table1 t3 ON
(t1.somefield = t3.somefield
AND t1.otherfield = t3.otherfield /*add more fields if need be */
AND t3.id > t2.id)
WHERE (t3.id IS NULL)
ORDER BY t2.id ASC
Questo dovrebbe eliminare solo il 2 ° duplicato e lascia solo il 3 ° e oltre i duplicati.
Se si desidera qualcosa di meno esoterica, e si dispone di una colonna timestamp, forse si vuole fare
DELETE t2 FROM table1 t2
INNER JOIN table1 t1 ON
(t1.somefield = t2.somefield
AND t1.otherfield = t2.otherfield /*add more fields if need be */
AND t2.`timestamp` > t1.`timestamp`)
WHERE (1=1) /*In some mode(s) MySQL requires a where clause with delete*/
ORDER BY t2.id ASC
per favore pubblica la definizione del tuo tavolo. –
Sono duplicati esatti o hai una chiave univoca da qualche parte? – Jason
Un vero duplicato è la copia esatta dell'originale. Hai davvero dei duplicati o hai delle righe in cui molti dati sono identici, ma qualcosa come la colonna auto inc o la data di creazione sono diversi? – Zak