2013-01-15 4 views
5

ho letto tutte le pertinenti duplicati domande/risposte e ho trovato questo per essere la risposta più rilevanti:Individuare e rimuovere le righe duplicate da due colonne

INSERT IGNORE INTO temp(MAILING_ID,REPORT_ID) 
SELECT DISTINCT MAILING_ID,REPORT_IDFROM table_1 
; 

Il problema è che voglio per rimuovere i duplicati da col1 e col2, ma voglio anche includere nell'inserto tutti gli altri campi di table_1.

Ho provato ad aggiungere tutte le colonne rilevanti in questo modo:

INSERT IGNORE INTO temp(M_ID,MAILING_ID,REPORT_ID, 
MAILING_NAME,VISIBILITY,EXPORTED) SELECT DISTINCT 
M_ID,MAILING_ID,REPORT_ID,MAILING_NAME,VISIBILITY, 
EXPORTED FROM table_1 
; 


M_ID(int,primary),MAILING_ID(int),REPORT_ID(int), 
MAILING_NAME(varchar),VISIBILITY(varchar),EXPORTED(int) 

Ma è inserito tutte le righe in temperatura (compresi i duplicati)

+2

Bene per una cosa: non usare 'INSERT IGNORE' nel tuo caso, 2nd -> Come è la tua tabella db impostare? – Neal

+0

puoi fornire record di esempio? –

+0

@Neal ha aggiornato la mia domanda con i nomi e i tipi di campo effettivi – user838437

risposta

3

È necessario prima di trovare i duplicati raggruppando in due campi con una clausola di avere.

Select identField1, identField2, count(*) FROM yourTable 
     GROUP BY identField1, identField2 
      HAVING count(*) >1 

Se questo restituisce ciò che si desidera, è possibile utilizzarlo come un sottoquery e

DELETE FROM yourTable WHERE field in (Select identField1, identField2, count(*) FROM yourTable 
     GROUP BY identField1, identField2 
      HAVING count(*) >1) 
+0

Questo manterrà una delle righe duplicate? (Voglio mantenerne una, non cancellare nessuna riga che abbia un duplicato) – user838437

+0

Rimuoverà tutti i duplicati. Se vuoi mantenerne uno, puoi selezionare un massimo o un minimo di un campo su cui non stai aggregando. Un rapido google ha trovato http://stackoverflow.com/questions/3777633/delete-duplicate-rows-dont-delete-all-duplicate?rq=1 che si collega anche ad altre domande identiche. – Scotch

+0

Cosa succede se la tabella ha solo 2 colonne ed entrambe le colonne sono raggruppate, come posso evitare di eliminare tutti i duplicati? – CMCDragonkai

9

Il modo migliore per eliminare le righe duplicate da più colonne è la più semplice:

Aggiungere un indice UNIQUE:

ALTER IGNORE TABLE your_table ADD UNIQUE (field1,field2,field3); 

L'abov IGNORA e si assicura che sia mantenuta solo la prima riga trovata, il resto scartato.

(È quindi possibile eliminare l'indice se sono necessari duplicati futuri e/o sapere che non si verificherà più).

+1

dà errore di sintassi :( –

+0

MOLTO più semplice delle subquery correlate – larrylampco

+0

A partire da MySQL 5.7.4, la clausola IGNORE per ALTER TABLE viene rimossa e il suo utilizzo produce un errore – ianaz

2

In caso contrario si potrebbe ottenere quello che volevi, allora si può provare il mio metodo "oldschool":

In primo luogo, eseguire la query per ottenere i record duplicati:

select column1, 
     column2, 
     count(*) 
from  table 
group by column1, 
     column2 
having count(*) > 1 
order by count(*) desc 

Dopo di che, selezionare tali risultati e incollarli nella notepad ++:

select query paste onto notepad

Now di USI ng trovare e sostituire la specialità del blocco note ++ sostituirli con; prima "cancella" poi "inserisci" query come questa (d'ora in poi, per ragioni di sicurezza, i miei valori saranno AAAA).

Nota speciale: Si prega di fare un altro nuova linea per la fine dell'ultima riga dei tuoi dati all'interno di Notepad ++ perché regex abbinato il '\ r \ n' alla fine del ogni riga:

enter image description here

trovare ciò regex: \D*(\d+)\D*(\d+)\D*\r\n

Sostituire con lo spago: delete from table where column1 = $1 and column2 = $2; insert into table set column1 = $1, column2 = $2;\r\n

Ora finalmente, incollare le query per la console di query di MySQL Workbench ed eseguire. Vedrai solo una occorrenza di ciascun record duplicato.

enter image description here

Questa risposta è per un tavolo rapporto costruito con soli due colonne senza ID. Penso che tu possa applicarlo alla tua situazione.

1

si può sempre ottenere gli ID primarie raggruppando che due campi univoci

select count(*), id as count from table group by col a, col b having count(*)>1;

e poi

delete from table where id in (select count(*), id as count from table group by col a, col b having count(*)>1) limit maxlimit;

si può anche utilizzare max() al posto di limit

+0

cosa fa il limite maxlimit? – Notflip

+1

@Notflip che si riferisce al numero di righe duplicate che si desidera eliminare –