2011-09-28 18 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 

Quiero escribir una consulta de tal manera que mi resultado se parece a esto:Eliminación de filas duplicadas de una tabla

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 

Quiero eliminar filas duplicadas de acuerdo con la dirección.

+2

Lea http://en.wikipedia.org/wiki/Database_normalization – YXD

+0

Cuando se duplica una dirección, ¿qué fila desea devolver en el conjunto de resultados? el primero por ID? –

+0

id 2 en no busca duplicados a ninguna otra fila ... ¿por qué quiere eliminar esto también? –

Respuesta

2

Suponiendo que desea devolver las filas con los valores de ID más pequeños:

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) 

Supuse que desea eliminar las filas que tienen duplicacy dirección y quiere seguir la fila de Identificación del mínimo de la tabla

0

Usted puede hacer esto fácilmente haciendo estos 3 sencillos pasos y por lo tanto 3 sentencias SQL:

Paso 1: Mueva los no duplicados (tuplas únicas) en un tempor ary table CREAR TABLA new_table como SELECCIONAR * FROM old_table WHERE 1 GROUP BY [columna para eliminar duplicados por];

Paso 2: eliminar eliminar la tabla anterior Ya no necesitamos la tabla con todas las entradas duplicadas, así que suéltala! DROP TABLE old_table;

Paso 3: cambie el nombre de la nueva_tabla al nombre de la antigua_table RENAME TABLE new_table TO old_table;

Por otro modo, se puede ir al enlace de abajo ... Su es también una buena manera ... Difícil pero con menos declaraciones http://dev.mysql.com/doc/refman/5.0/en/insert.html

9

Para comprobar lo que se va a eliminar:

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

Si está satisfecho con eso:

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

de esta manera se mantiene el registro con el valor máximo en la columna ID

+0

¿Qué sucede si necesito mantener una identificación menor? –

+0

Simplemente cambie 't1.id t2.id' – DavidEG

2

Es necesario crear una tabla duplicada/temporal con el mismo campo que tiene su tabla actual.

luego ejecutar SQL continuación

Primera clara tabla temporal: registro

DELETE FROM `#TMP_TABLE#`; 

Insertar en la tabla temporal de acuerdo con sus expectativas.

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 

truncar la tabla principal

DELETE FROM `#TABLE#`; 

copiar datos de tabla temporal

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

¿Está seguro de que no es posible hacerlo con una sola consulta? Comprueba mi respuesta, ¿me estoy perdiendo algo? – DavidEG

+0

@DavidEG, sí, es posible. tu genio su solución es perfecta –

+0

@ maulik.patel, puede usar la lógica anterior en condiciones más complejas –

4

Si no le importa cuál de las filas se mantiene

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

El ' IGNORE 'es importante, eso significa ignorar silenciosamente du plicar datos. (Es decir, ignora que al introducirlo en la 'nueva versión' de la mesa.)

posible que desee quitar los afterwoods índice

ALTER TABLE table DROP KEY 'address'; 
Cuestiones relacionadas