2010-10-05 31 views
7

Mam tabelę z kolumną roku i ta kolumna nie powinna zawierać zduplikowanych wartości. Tak więc kończę na stole z tylko jednym rekordem 2007 roku na przykład.MySql: usunąć wiersze tabeli w zależności od wartości duplikatów kolumn?

Jak mogę usunąć te wiersze, które mają wartość w postaci duplikatu roku?

Dzięki

+0

jeśli masz na przykład 3 duplikaty wierszy do roku 2008, które wiersze zdecydujesz usunąć? –

+1

Duplikat http://stackoverflow.com/q/18932/80714 Odpowiedź jest jasna i zwięzła. – Chadwick

+0

To nie jest to samo pytanie –

Odpowiedz

8

myślę, że może po prostu spróbuj dodać unikatowy indeks używając IGNORUJ:

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

MySQL powinien odpowiedzieć z czymś takim:

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

Oczywiście, można zostawić to do MySQL, aby zdecydować, które wiersze upuścić.

EDIT:

to działa tak wielu kolumn, jak chcesz: dokumentację

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

czeku MySQL na CREATE INDEX. Wspólnym groszkiem (co najmniej jeden raz napotkany) jest zapomnieć, że NULL = NULL nie jest prawdą (ale NULL), stąd {42, NULL} i {42, NULL} są dozwolone dla indeksu UNIQUE na dwóch kolumnach.

+0

Dzięki pracy doskonale, ale czy można ją zastosować na dwóch kolumnach? –

+0

@feras tyle, ile chcesz. zobacz moje EDYTOWANIE – sfussenegger

+0

Dzięki działa jak urok –

3

Akceptowane odpowiedź działa idealnie, ale IGNORE słowa kluczowe id amortyzowane teraz (Source), to nie będzie działać po MySQL 5.6 (może być).

Chociaż alter table opcja jest bardzo łatwy i bezpośredni Ale teraz jedyną opcją jest utworzenie nowej tabeli przez kwerendę tak:

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

Po tym można usuwać i zmieniać nazwy <your_table><table_name> do stolika.

W tym miejscu można zmienić listę kolumn w klauzuli Group By zgodnie z potrzebami (ze wszystkich kolumn do jednej kolumny lub kilka kolumn, które mają podwójne wartości łącznie).

Tutaj chcę też wspomnieć punkt:

  1. unikalny indeks nie robi zmian w rzędzie czy jakieś kolumny (z indeksem, jak tu 3 kolumny) mają null jako wartość. Ex: null,1,"asdsa" można przechowywać dwa razy
  2. sam sposób, jeśli masz jedną kolumnę w unikalnym indeksem wtedy wiele wierszy z null wartości (na tej kolumnie) Czy pozostaje w tabeli
  3. Punktem plus z create table jest, będzie pracować z zerową wartości również.
-1

Funkcja "GROUP BY" nie działa, jeśli dowolne wybrane kolumny nie są zależne od kolumn "grupuj według". Zobacz "ONLY_FULL_GROUP_BY" sql_mode. Możesz zmienić sql_mode, ale nie mogłem tego zrobić z knex (mój ORM). Skończyło się na tym, że filtrowanie zwróconych wyników sql w kodzie.

Powiązane problemy