Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Borrar duplicados

Estas en el tema de Borrar duplicados en el foro de Mysql en Foros del Web. Buenas mi duda es la siguiente: Tengo una base de datos con con elementos duplicados por ejemplo, dos nº de teléfono repetidos y quiero borrar ...
  #1 (permalink)  
Antiguo 02/11/2010, 08:56
 
Fecha de Ingreso: marzo-2009
Mensajes: 78
Antigüedad: 15 años, 1 mes
Puntos: 0
Borrar duplicados

Buenas mi duda es la siguiente:

Tengo una base de datos con con elementos duplicados por ejemplo, dos nº de teléfono repetidos y quiero borrar los duplicados y quedarme sólo con un registro.

¿Como sería la consulta?

Muchas gracias.
  #2 (permalink)  
Antiguo 02/11/2010, 09:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Borrar duplicados

Más que una consulta, lo tuyo es una migración de datos.
Habría que conocer la estructura de las tablas para ver cómo hacerlo. No existe una única forma de lograrlo.
Y además implementar una forma de evitar nuevas duplicaciones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 03/11/2010, 03:32
 
Fecha de Ingreso: marzo-2009
Mensajes: 78
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Borrar duplicados

Es una tabla en la que hay valores repetidos y yo quiero borrarlos y quedarme sólo con uno.

Por ejemplo dos personas distintas con el mismo teléfono, pues yo quiero borrar a una de esas personas para tener sólo un teléfono.

Gracias.
  #4 (permalink)  
Antiguo 03/11/2010, 04:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Borrar duplicados

Yo te entendí. Tu no has entendido cómo se implementa eso.

Para poder borrar un conjunto de datos duplicados, lo primero que debes lograr es, o agrupar los que quieres mantener o determinar los que quieres eliminar.
En el primer caso deberías:
- Volcar en una tabla nueva todos aquellos que quieres mantener, descartando los duplicados.
- Vaciar la tabla original.
- Volver a poner en la tabla original los que guardaste.
-Eliminar la tabla transitoria.

En el segundo caso:
- Determinar, por medio de una consulta, qué condición o condiciones cumplen solamente los registros que deseas borrar, volcando lo todo en una tabla temporal.
- Iterar uno a uno los registros encontrados y borrarlos de la tabla origen.
- Descartar la tabla temporal.

No puedes indicar simplemente borrar esos registros, porque si el contenido de las duplicidades es exactamente el mismo entre dos registros dados, MySQL no podrá diferenciar entre ambos y los borrará todos. Por eso la forma simple es hacer alguno de los dos procesos que te menciono.

En cualquier caso tu problema es un problema de lógica y no de sentencias: ¿Cómo lograr determinar cuáles registros descartar, sin descartar todos?

Por otro lado, esto:
Cita:
Por ejemplo dos personas distintas con el mismo teléfono, pues yo quiero borrar a una de esas personas para tener sólo un teléfono.
no tiene mucho sentido para mí...
¿Qué representa esa tabla, en donde lo importante es el teléfono y no la persona?
¿Cómo defines con qué persona quedarte?

Me parece que tienes que plantearte mejor el problema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 03/11/2010, 04:24
 
Fecha de Ingreso: marzo-2009
Mensajes: 78
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Borrar duplicados

Gracias, ya sé que no tiene mucha lógica lo del teléfono pero es el filtro que tengo que usar.

Lo voy a plantear con la edad a ver si así está más claro:

Por ejemplo quiero tener una persona de cada edad y en mi tabla aparecen dos personas con 20 años y tres con 23, lo que yo quiero es quedar con sólo una persona de 20 años y una de 23.


No consigo quedarme con una persona de cada, por ejemplo con una de 20 pero me borra todas las de 23, esta es la consulta que tengo hecha

DELETE Tabla1.edad, Tabla1.nombre
FROM Tabla1
WHERE (((Tabla1.edad) In (SELECT [edad] FROM [Tabla1] As Tmp GROUP BY [edad] HAVING Count(*)>1 ))) AND Tabla1.Id1 < (SELECT MAX(Tabla1.id1) FROM Tabla1);

¿Podrías ayudarme?

Gracias
  #6 (permalink)  
Antiguo 03/11/2010, 06:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Borrar duplicados

Cita:
No consigo quedarme con una persona de cada, por ejemplo con una de 20 pero me borra todas las de 23, esta es la consulta que tengo hecha
Precisamente ese es el tipo de problemas a que me refiero.
La única forma de poder ayudarte con precisión sería estar sentado frente a tu PC realizando el análisis de datos necesario, cosa que no puede ser.

Como pareces sugerir, el problema que tienes requiere un análisis de datos puntual.
Primero, mi sugerencia es que separes en una tabla todos aquellos casos que están efectivamente duplicados. De nada te servirá mirar toda la tabla si no toda la tabla tiene el mismo problema.
Uno de los problemas que tienes es que no puedes hacer un SELECT y DELETE en la misma sentencia, por lo que la única forma práctica sería volcar todos los datos a otra tabla. ara ello vamos a probar de guardar aquellas personas e mayor edad (el principio para guardar los menores sólo requiere cambiar la función:

Guardar sin discriminar edades:
Código MySQL:
Ver original
  1. CREATE TABLE respaldo LIKE tabla;
  2. INSERT INTO respaldo
  3. FROM tabla
  4. GROUP BY telefono;

Discriminando edades máximas requiere poner todos los campos para poder indicar el agrupamiento correctamette
Código MySQL:
Ver original
  1. CREATE TABLE respaldo LIKE tabla;
  2. INSERT INTO respaldo
  3. SELECT a, b, c, d, MAX(edad) edad, f, g, h
  4. FROM tabla
  5. GROUP BY telefono
  6. HAVING COUNT(*)>1);
donde a, b, c, d, e, f, g y h, son los nombres de los campos de la tabla en el mismo orden de la tabla, por lo que "MAX(edad) edad" deberá ocupar el lugar correspondiente a la edad.
Este agrupamiento generará una tabla simplificada que luego usamos para borrar los excedentes por medio de su PK:

Código MySQL:
Ver original
  1. DELETE FROM tabla
  2. WHERE id NOT IN (SELECT id FROM respaldo);

Mas o menos esto, podría andar....

Esto es lo que se denomina en ocasiones "migrar datos entre tablas" o "depurar tablas", y como verás no se peude hacer en una sola sentencia.

Lo principal, una vez que termines esto es asegurarte que la fuente de datos, es decir, el formulario desde el cual estos registros se ingresan, tenga una validación que impida insertar un teléfono duplicado.
Una forma drástica es declarar el telefono como UNIQUE. Eso generará un error de registro duplicado cada vez que se intente ingresar un teléfono que ya exista.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: borrar, duplicados
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:40.