2011-09-28 23 views
8
id  lat    long  speed  date   address 
1 22.92138131 72.44103313  3.96 km/h  2011-09-26 National, Gujarat, India 
2 22.92138145 72.44103413  13.96 km/h  2011-09-26 National, Gujarat, India 
3 22.92138134 72.44103423  15.96 km/h  2011-09-26 National, Gujarat, India 
4 22.92138454 72.44103233  13.96 km/h  2011-09-26 10t ring Rd, Nehru Nagar 
5 22.92138354 72.44102533  13.96 km/h  2011-09-26 Anandnagar Rd, Ahmedabad 
6 22.92138484 72.44103293  19.96 km/h  2011-09-26 Anandnagar Rd, Ahmedabad 

Chcę napisać kwerendę tak, że mój wynik wygląda tak:Usuwanie zduplikowanych wierszy z tabeli

id  lat    long  speed  date   address 
1 22.92138131 72.44103313  3.96 km/h  2011-09-26 National, Gujarat, India 
4 22.92138454 72.44103233  13.96 km/h  2011-09-26 10t ring Rd, Nehru Nagar 
5 22.92138354 72.44102533  13.96 km/h  2011-09-26 Anandnagar Rd, Ahmedabad 

Chcę usunąć zduplikowane wiersze według adresu.

+2

Proszę przeczytać http://en.wikipedia.org/wiki/Database_normalization – YXD

+0

Gdzie jest duplikowany adres, który wiersz chcesz zwrócić w zestawie wyników? pierwszy według ID? –

+0

id 2 nie szuka duplikatów do żadnych innych wierszy .. dlaczego chcesz usunąć to również .. –

Odpowiedz

2

Zakładając, że chcesz wrócić wiersze z najmniejszymi wartościami ID:

SELECT 
    * 
FROM 
TABLENAME T INNER JOIN 
(
    SELECT MIN(ID) AS ID FROM TableName 
    GROUP BY Address 
) SUB ON T.ID = SUB.ID 
0
delete from table_name tb where id not in 
    (select min(id) from table_name tb1 group by address) 

Sądziłem, że chcesz usunąć wiersze zawierające adres duplicacy i chcesz zachować wiersz Minimalne wymogi id przez w tabeli

0

można to zrobić łatwo Wykonując te 3 proste kroki, a więc 3 SQL:

Krok 1: Przenieś non duplikaty (niepowtarzalny krotki) do tempor tabela pomocnicza STWÓRZ TABELĘ new_table jako SELECT * FROM old_table WHERE 1 GROUP BY [kolumna, aby usunąć duplikaty według];

Krok 2: usuń usuń starą tabelę Nie potrzebujemy już tabeli ze wszystkimi zduplikowanymi wpisami, więc upuść ją! STOLIK DROP stary_ stół;

Krok 3: zmień nazwę nowej_table na nazwę old_table TABELA RENAME new_table TO old_table;

Na inny sposób można przejść do Bellow link ... Jest to również dobry sposób ... trudne, ale z mniej sprawozdania http://dev.mysql.com/doc/refman/5.0/en/insert.html

9

Aby sprawdzić, co masz zamiar usunąć:

SELECT distinct t1.* 
    FROM yourtable as t1 
    join yourtable as t2 
WHERE t1.address = t2.address 
    and t1.id < t2.id 

Jeśli jesteś zadowolony z tego:

DELETE t1 
    FROM yourtable as t1 
    join yourtable as t2 
WHERE t1.address = t2.address 
    and t1.id < t2.id 

w ten sposób można zachować zapis o maksymalnej wartości w kolumnie id

+0

co jeśli muszę zachować niższy identyfikator? –

+0

Po prostu zmień 't1.id t2.id' – DavidEG

2

Potrzebujesz utworzyć duplikat/tabelę tymczasową z tym samym polem, co Twoja obecna tabela.

Następnie wykonać poniżej SQL

pierwsze jasne tabeli tymczasowej: rekord

DELETE FROM `#TMP_TABLE#`; 

Wstaw w tabeli tymczasowej, jak na swoje oczekiwania.

INSERT INTO `#TMP_TABLE#` 
SELECT T . * 
FROM #TABLE# T 
INNER JOIN (
    SELECT MIN(ID) AS ID 
    FROM #TABLE# 
    GROUP BY address 
    ) SUB ON T.id = SUB.id 

Obciąć głównej tabeli

DELETE FROM `#TABLE#`; 

skopiować dane z tabeli tymczasowej

INSERT INTO #TABLE# SELECT * FROM `#TMP_TABLE#` 
+0

Czy jesteś pewien, że nie można tego zrobić za pomocą jednego zapytania? Sprawdź moją odpowiedź, czy czegoś brakuje? – DavidEG

+0

@DavidEG, tak, jest to możliwe. geniusz. twoje rozwiązanie jest idealne jeden, to: –

+0

@ maulik.patel, możesz użyć powyższej logiki w bardziej złożonym stanie –

4

Jeśli nie obchodzi, który z wierszy zachować

ALTER IGNORE TABLE table ADD UNIQUE KEY 'address' (`address`); 

The ' IGNORE "jest ważne, to oznacza cichą ignorację du fałszować dane. (Tj ignoruje go podczas wkładania do „nowej wersji” stołu.)

Może chcesz usunąć afterwoods indeksu

ALTER TABLE table DROP KEY 'address'; 
Powiązane problemy