2009-11-25 24 views
16

¿Cómo eliminar duplicados en esta configuración?Filas duplicadas de Mysql (Duplicado detectado usando 2 columnas)

id A  B 
---------------- 
1  apple 2 
2  orange 1  
3  apple 2 
4  apple 1 

Aquí quiero eliminar (apple, 2) que aparece dos veces. Los números de identificación son únicos. Usaría la palabra clave DISTINCT si no fuera así. ¿Puedo de alguna manera hacer una clave de las columnas A y B y luego usar la palabra clave DISTINCT para obtener lo que necesito? Muchas gracias por tus respuestas.

+0

Gracias a todos por las respuestas nuevamente. Creo que ahora tengo una buena idea de cómo proceder. – jason

Respuesta

17
delete from myTable 
where id not in 
(select min(id) 
from myTable 
group by A, B) 

es decir, la selección entre paréntesis devuelve la primera identificación para cada grupo de A y B; borrar todos los identificadores que no están en este conjunto eliminará todas las ocurrencias de una combinación A-más-B que son "posteriores" a su primera aparición.

EDITAR: esta sintaxis parece ser problemático: ver informe de error:

http://bugs.mysql.com/bug.php?id=5037

Una posible solución consiste en hacer esto:

delete from myTable 
where id not in 
(
     select minid from 
     (select min(id) as minid from myTable group by A, B) as newtable 
) 
+0

Agradable. Muy agradable. –

+0

¿Cómo funciona esto en relación con mi respuesta a continuación? No soy lo suficientemente un gurú DB para analizarlo ... –

+0

Bueno ... esto eliminará la fila donde id = 3 y no donde id en 1,3 –

1
DELETE FROM fruit_table FT1 
WHERE EXISTS 
(
    SELECT * FROM fruit_table FT2 
    WHERE FT2.fruit_name_column = FT1.fruit_name_column 
    AND FT2.fruit_integer_column = FT1.fruit_integer_column 
    AND FT2.id <> FT1.id 
) 

Esto le supone Don No importa cuál de los registros duplicados se eliminó.

+0

Errores para mí en MySQL - "Usted tiene un error en su sintaxis SQL, consulte el manual que corresponde a su versión de servidor MySQL para la sintaxis correcta para usar cerca de 'FT1' – Utkanos

0

se puede utilizar una tabla temporal con los datos que desea:

insert into temp_table 
select min(id), A, B 
group by A, B 
0

No estoy exactamente seguro de lo que estás pidiendo aquí. Si no quiere duplicados de las columnas A y B, haga lo que mencionó SELECT DISTINCT A, B FROM XXX. Tal vez podría publicar un ejemplo del tipo de resultado que le gustaría ver.

+0

Supongo que" grupo por "es lo que me faltaba, los otros mensajes han aclarado esto. – jason

1
DELETE 
FROM mytable 
USING mytable, mytable AS vtable 
WHERE vtable.id > mytable.id 
AND mytable.A = vtable.A 
AND mytable.A = vtable.A 
+0

Errores para mí en MySQL - "Tiene un error en su sintaxis de SQL, consulte el manual que corresponde a su versión de servidor MySQL para la sintaxis correcta para usar cerca de 'tbl USING ..." – Utkanos

6

Otro más (de http://labs.creativecommons.org/2010/01/12/removing-duplicate-rows-in-mysql/). Agregar un índice único a continuación, eliminarlo:

ALTER IGNORE TABLE mytable ADD UNIQUE INDEX tmpindex (A,B); 
ALTER TABLE mytable DROP INDEX tmpindex; 

La palabra clave IGNORE es una extensión de MySQL que hace caer filas que infringen la palabra clave UNIQUE en lugar de sólo en su defecto.

+1

No funciona en mysql –

Cuestiones relacionadas