Ver Mensaje Individual
  #6 (permalink)  
Antiguo 03/11/2010, 06:25
Avatar de gnzsoloyo
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)