2010-10-05 15 views
7

Ho una tabella con la colonna dell'anno e questa colonna non dovrebbe avere valori duplicati. Quindi, per esempio, finisco con un tavolo con un solo record del 2007.MySql: rimuove le righe della tabella in base ai valori duplicati delle colonne?

Quindi, come posso cancellare quelle righe con valore di anno doppio?

Grazie

+0

se si dispone per esempio di 3 righe duplicate all'anno 2008, quali righe si decide di eliminare? –

+1

Duplicato di http://stackoverflow.com/q/18932/80714 La risposta è chiara e concisa. – Chadwick

+0

Questa non è la stessa domanda –

risposta

8

Penso che si potrebbe semplicemente provare ad aggiungere un indice univoco utilizzando IGNORA:

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`column`); 

MySQL dovrebbe rispondere con qualcosa come:

Query OK, 4524 rows affected (1.09 sec) 
Records: 4524 Duplicates: 9342 Warnings: 0 

Naturalmente, si Lascerai fino a MySQL per decidere quali file eliminare.

EDIT:

Questo funziona per tutte le colonne che vuoi: documentazione

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`col1`, `col2`, `col3`); 

controllo di MySQL su CREATE INDEX. Un trucco comune (almeno uno che ho incontrato una volta) è dimenticare che NULL = NULL non è vero (ma NULL), quindi {42, NULL} e {42, NULL} sono consentiti per un indice UNIQUE su due colonne.

+0

Grazie perfettamente funziona, ma è possibile applicarlo su due colonne? –

+0

@feras quante ne vuoi. vedi il mio EDIT – sfussenegger

+0

Grazie funziona come un fascino –

3

risposta accettata funziona perfettamente, ma IGNORE parole chiave id ammortizzati ora (Source), non funzionerà dopo MySQL 5.6 (può essere).

Anche se alter table opzione è molto semplice e diretto, ma, ora unica opzione è quella di creare nuova tabella da una query come questa:

CREATE TABLE <table_name> AS SELECT * FROM <your_table> GROUP BY col1,col2,col3; 

Dopo di che è possibile eliminare e rinominare <your_table><table_name> al vostro tavolo.

Qui è possibile modificare l'elenco di colonne nella clausola Group By in base alle proprie esigenze (da tutte le colonne a una colonna o poche colonne che hanno valori duplicati insieme).

Qui voglio anche parlare di un punto:

  1. indice univoco non apportare cambiamenti in fila se le colonne (da indice, come qui 3 colonne) hanno null come valore. Es: null,1,"asdsa" può essere memorizzato
  2. stesso modo se si dispone singola colonna indice univoco poi più righe con null valori (per quella colonna) si rimane in tabella
  3. Il punto plus con create table è, funziona con null anche i valori.
-1

'GROUP BY' non funziona se alcune colonne di selezione non hanno una dipendenza dalle colonne 'raggruppa per'. Vedi 'ONLY_FULL_GROUP_BY' sql_mode. Puoi cambiare sql_mode ma non sono stato in grado di farlo con knex (mio ORM). Ho finito per fare il filtraggio dei risultati sql restituiti nel codice.

Problemi correlati