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 

Voglio scrivere una query in modo che il mio risultato è simile al seguente:Rimozione di righe duplicate da una tabella

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 

Voglio rimuovere le righe duplicate secondo l'indirizzo.

+2

Si prega di leggere http://en.wikipedia.org/wiki/Database_normalization – YXD

+0

Dove viene duplicato un indirizzo, quale riga vuoi tornare nel set di risultati? il primo per ID? –

+0

id 2 non sembra duplicato a nessun'altra riga .. perché vuoi rimuovere anche questo .. –

risposta

2

Supponendo che si desidera tornare le righe con i valori ID più piccoli:

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) 

ho pensato che si desidera rimuovere le righe che hanno l'indirizzo duplicacy e desidera mantenere fila di id minimo nella tabella

0

si può fare questo in modo semplice eseguendo questi 3 semplici passi e quindi 3 le istruzioni SQL:

Fase 1: Spostare i non duplicati (tuple unici) in una tempor ary table CREATE TABLE new_table come SELECT * FROM old_table DOVE 1 GROUP BY [colonna per rimuovere i duplicati di];

Passaggio 2: elimina elimina la tabella precedente Non abbiamo più bisogno della tabella con tutte le voci duplicate, quindi rilasciatela! DROP TABLE old_table;

Passaggio 3: rinominare new_table al nome del vecchio_table RENAME TABLE new_table TO old_table;

di un altro modo si può andare al Bellow link ... Il suo è anche un buon modo ... Difficile ma con meno dichiarazioni http://dev.mysql.com/doc/refman/5.0/en/insert.html

9

Per controllare ciò che si sta per eliminare:

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

Se si è soddisfatti che:

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

in questo modo si mantiene il record con il valore massimo sulla colonna id

+0

cosa devo fare se devo mantenere l'id inferiore? –

+0

Basta cambiare 't1.id t2.id' – DavidEG

2

È necessario creare una tabella duplicata/temporanea con lo stesso campo della tabella corrente.

quindi eseguire sotto SQL

Prima chiara tabella temporanea:

DELETE FROM `#TMP_TABLE#`; 

Inserisci record nella tabella temporanea secondo la vostra aspettativa.

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 

Tronca tabella principale

DELETE FROM `#TABLE#`; 

copiare i dati dalla tabella temporanea

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

Sei sicuro di non poterlo fare con una query? Controlla la mia risposta, mi sto perdendo qualcosa? – DavidEG

+0

@DavidEG, sì è possibile. genio. la tua soluzione è perfetta –

+0

@ maulik.patel, puoi usare la logica sopra in condizioni più complesse –

4

Se non vi interessa che le righe si mantiene

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

Il ' IGNORA 'è importante, significa ignorare silenziosamente du plicate i dati. (Vale a dire lo ignora quando si inserisce nella 'nuova versione' del tavolo.)

consiglia di rimuovere i dopo Woods indice

ALTER TABLE table DROP KEY 'address'; 
Problemi correlati