2011-09-07 27 views
8

Ho 511 duplicati nella mia tabella, ho bisogno di cancellarli, ma non gli originali. Pertanto voglio eliminare ogni secondo occorrenza di ogni duplicato.MYSQL Elimina i primi duplicati dalla tabella

Come posso fare questo?

TABELLA:

code/ status/ time 
E3F4FF928A/0/
07D95444BB/0/ 
07D95444BB/ 0/
40006C128F/0/1315293012 
2B45790E52 /0/
40006C128F/0/1315293012 
+0

per favore pubblica la definizione del tuo tavolo. –

+1

Sono duplicati esatti o hai una chiave univoca da qualche parte? – Jason

+1

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

risposta

8

aggiungere un indice univoco per la tabella nella colonna che dovrebbe essere unico, e ignorare gli errori

alter ignore table X add unique index (column_a) 

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

+0

Non indirizza * Voglio eliminare ogni secondo occorrenza di ogni duplicato. * –

+0

sì, questo non porta a termine il risultato desiderato . –

+1

essere più specifico .. hai un b a b c b a .. vuoi un b c o vuoi un b c b a? – Zak

0
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 
1

Proprio incorrere in questo problema oggi (senza chiave univoca nella tabella).

ho risolto in questo modo

DELETE FROM table where code=x and status=y and time=z LIMIT 1; 

Questo cancellerà il primo 1 riga per i criteri indicati (se si dispone di n duplicati, mettere n-1 per mantenere solo uno).

+0

non risponde alla domanda – chuse

Problemi correlati