Ver Mensaje Individual
  #10 (permalink)  
Antiguo 11/04/2008, 05:26
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Re: Select entregando resultados duplicados o triplicados

Lo primero es que veas en qué tabla de las tuyas puedes utilizar esto. Yo he pensado que querías eliminar las repeticiones de donde tienes los teléfonos y profesiones.

Ojo, no pruebes esto directamente en tu tabla; crea otra y adapta los nombres para que no afecte a la tuya, de la que previamente debes haber guardado una copia; luego prueba esto sobre la tabla duplicada o creada al efecto para probarlo .

1) Debes vigilar que los id de esa tabla no sean utilizados en otra tabla (es decir que sean PK y aparezcan como FK, porque si eso es así deberás sacar con esta consulta los datos de los id por nombre y apellidos, imprimirlos en papel, y luego, al final de todo el proceso, en la otra tabla relacionada hacer los cambios pertinentes de los id borrados por el que queda de cada cliente.

Select nombre, apellido, group_concat (cast(id as char)) as identificadores, group_concat(teléfono) as teléfonos, group_concat(profesión) as profesiones from registro group by concat(nombre,apellido) having count(*) > 1 order by apellido, nombre

2) Esta consulta de actualización (peligro, cambia datos: pruébala con un duplicado de tu tabla antes) te rellena los campos de teléfono y profesión de todos los que tienen el mismo apellido y nombre. Ojo, porque yo he creído que sí puedes dejar en blanco el campo de teléfono y el de profesión, es decir, que no admite nulo. Si admite nulo tendrás que cambiar la sintaxis para que los encuentre...
UPDATE registro r1, registro r2 SET r1.teléfono = if(r1.teléfono LIKE '', r2.teléfono, r1.teléfono), r1.profesión =IF (r1.profesión LIKE '', r2.profesión, r1.profesión) where concat(r1.apellido,r1.nombre) LIKE concat(r2.apellido,r2.nombre) AND r1.id != r2.id

Pueden escaparse nombres compuestos del tipo de José y José Luis, apellidos dobles frente al simple, teléfonos dobles, etc. pero eso lo podrás ver luego con tu tabla original bien guardada...

3) Una vez comprobado que no hay problemas de relaciones, que están los campos completos, haces esto
CREATE TABLE registro2 as SELECT * FROM Registro GROUP BY CONCAT(Nombre,Apellido) order by min(id)

Creas una tabla que luego será la tabla. Probablemente perderás alguna pequeña cosa, pero ya tendrás resuelto parte del problema.
Luego tendrás que hacer un índice único de los dos campos, nombre y apellido para evitar que te suceda esto otra vez.

Puedes hacer otras cosas con programación, pero eso te requeriría conocimientos de PHP o algún otro programa.