Mysql
 sql >> Database >  >> RDS >> Mysql

Rimuovere le righe duplicate lasciando solo la riga più vecchia?

Poiché stai utilizzando la colonna id come indicatore di quale record è "originale":

delete x 
from myTable x
 join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id

Questo lascerà un record per indirizzo email.

modifica per aggiungere:

Per spiegare la domanda di cui sopra...

L'idea qui è di unirsi al tavolo contro se stesso. Fai finta di avere due copie della tabella, ognuna con un nome diverso. Quindi potresti confrontarli tra loro e trovare l'ID più basso o per ciascun indirizzo email. Vedresti quindi i record duplicati che sono stati creati in seguito e potresti eliminarli. (Stavo visualizzando Excel mentre pensavo a questo.)

Per eseguire quell'operazione su una tabella, confrontarla con se stessa ed essere in grado di identificare ogni lato, usi gli alias di tabella. x è un alias di tabella. È assegnato nel from clausola in questo modo:from <table> <alias> . x ora può essere utilizzato altrove nella stessa query per fare riferimento a quella tabella come collegamento.

delete x avvia la query con la nostra azione e il nostro obiettivo. Eseguiamo una query per selezionare i record da più tabelle e vogliamo eliminare i record che appaiono in x .

Gli alias sono usati per fare riferimento a entrambe le "istanze" della tabella. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail fa urtare il tavolo contro se stesso dove le e-mail corrispondono. Senza la clausola where che segue, ogni record verrebbe selezionato in quanto potrebbe essere unito contro se stesso.

Il where la clausola limita i record selezionati. where x.id > z.id consente l'"istanza" alias x per contenere solo i record che corrispondono alle email ma hanno un id più alto valore. I dati che vuoi veramente nella tabella, indirizzi email univoci (con l'id più basso) non faranno parte di x e non verrà cancellato. Gli unici record in x saranno record duplicati (indirizzi email) che hanno un id più alto rispetto al record originale per quell'indirizzo email.

Le clausole join e where possono essere combinate in questo caso:

delete x 
  from myTable x 
  join myTable z
    on x.subscriberEmail = z.subscriberEmail
      and x.id > z.id

Per evitare duplicati, considera di rendere la colonna SubscriberEmail una colonna indicizzata UNICA.