Foros del Web » Programando para Internet » PHP »

suprimir registros dobles en mysql con php

Estas en el tema de suprimir registros dobles en mysql con php en el foro de PHP en Foros del Web. Hola amigos les cuento que trabajo con php y mysql pero tengo un problema y es q tengo una tabla con un montón de registros ...
  #1 (permalink)  
Antiguo 31/01/2010, 14:07
Avatar de Yamilskate  
Fecha de Ingreso: septiembre-2006
Mensajes: 94
Antigüedad: 17 años, 7 meses
Puntos: 0
suprimir registros dobles en mysql con php

Hola amigos les cuento que trabajo con php y mysql pero tengo un problema y es q tengo una tabla con un montón de registros duplicados que no deberían estar hay, por ejemplo tengo una tabla con 3 campos:

cve | ide | nombre
01 | 1 | uno
01 | 2 | dos
02 | 1 | uno
02 | 1 | uno

Como pueden observar el registro de la fila número 3 y 4 están repetidos por el mismo ide y lo que necesito es elaborar un pequeño script que me elimine esos registros dejando la tabla algo así:

cve | ide | nombre
01 | 1 | uno
01 | 2 | dos
02 | 1 | uno

Espero me puedan ayudar, quedare eternamente agradecido!

Última edición por Yamilskate; 31/01/2010 a las 14:13
  #2 (permalink)  
Antiguo 31/01/2010, 14:16
Avatar de dggluz  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 525
Antigüedad: 15 años
Puntos: 50
Respuesta: suprimir registros dobles en mysql con php

Supongo que tienes que recorrer todos los resultados e ir eliminándolos de a uno... el problema es que si son exactamente iguales (no tienen ni siquiera id autoincrementable), va a ser un problema no borrar todos, no sólo las réplicas... una solución que se me ocurre es eliminar todos los registros que tengan réplicas y luego volver a insertarlos una sola vez. Para saber si un registro tiene réplica simplemente recorre los resultados de una consulta (ordenada por alguno de los campos) y guarda en un array todos los datos del anterior registro. Por cada vuelta comparas el anterior registro con el actual, si son iguales es que el segundo es una réplica del primero. ¡Suerte!
  #3 (permalink)  
Antiguo 31/01/2010, 14:18
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: suprimir registros dobles en mysql con php

Podrias hacerlo en crear un while que verifique la base de datos y un if dentro del while que compare alguna variable que este en el while para borre todo registro duplicado, ejemplo
Código PHP:
Ver original
  1. $s = "SELECT * FROM tabla";
  2. $q = mysql_query($s) or die(mysql_error());
  3. $var = "";
  4. while($row = mysql_fetch_assoc($q)){
  5.     if($row["ide"].$row["cve"] == $var){
  6.         echo $row["ide"]."<br>";
  7.         //aqui va la consulta de borrar también con la parte de id, si es que tienes un incrementable
  8.     }
  9.     $var= $row["ide"].$row["cve"];
  10. }
Analiza el código y verás lo que te digo.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 31/01/2010 a las 14:23
  #4 (permalink)  
Antiguo 31/01/2010, 14:39
Avatar de dggluz  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 525
Antigüedad: 15 años
Puntos: 50
Respuesta: suprimir registros dobles en mysql con php

Cita:
Iniciado por abimaelrc Ver Mensaje
Podrias hacerlo en crear un while que verifique la base de datos y un if dentro del while que compare alguna variable que este en el while para borre todo registro duplicado, ejemplo
Código PHP:
Ver original
  1. $s = "SELECT * FROM tabla";
  2. $q = mysql_query($s) or die(mysql_error());
  3. $var = "";
  4. while($row = mysql_fetch_assoc($q)){
  5.     if($row["ide"].$row["cve"] == $var){
  6.         echo $row["ide"]."<br>";
  7.         //aqui va la consulta de borrar también con la parte de id, si es que tienes un incrementable
  8.     }
  9.     $var= $row["ide"].$row["cve"];
  10. }
Analiza el código y verás lo que te digo.
En realidad, lo que propones tiene que tener dos cuidados:
  1. La consulta debe estar ordenada, no importa por cual campo, pero debe estar ordenada por alguno. Sino las réplicas que tengan algún registro entre éstas no saldrán a la luz.
  2. En lugar de armar una cadena con las partes del array $row, yo guardaría directamente todo el array para compararlo. Sino puede derse casos de réplicas que en realidad no lo sean (aunque es muy improbable), por ejemplo si "ide"='h' y "cve"='olas' en un registro y en otro "ide"='hola' y "cve"='s'.
¡Suerte!
  #5 (permalink)  
Antiguo 31/01/2010, 14:45
Avatar de xbx
xbx
 
Fecha de Ingreso: mayo-2008
Ubicación: /home/xbx
Mensajes: 301
Antigüedad: 15 años, 11 meses
Puntos: 11
Respuesta: suprimir registros dobles en mysql con php

A ver si alguien la agarra:
Código MySQL:
Ver original
  1. INSERT INTO tabla_nueva_sin_duplicados
  2. (
  3. SELECT * FROM tabla_vieja
  4. GROUP BY cve,ide,nombre
  5. )


Saludos,
  #6 (permalink)  
Antiguo 31/01/2010, 14:58
Avatar de Yamilskate  
Fecha de Ingreso: septiembre-2006
Mensajes: 94
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: suprimir registros dobles en mysql con php

Excelente!!!

Gracias a todos por su rapida y magnifica ayuda, el ultimo funciono a la perfección!

Saludos!! :D
  #7 (permalink)  
Antiguo 31/01/2010, 14:58
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: suprimir registros dobles en mysql con php

Hola,

Cita:
Iniciado por xbx Ver Mensaje
Código MySQL:
Ver original
  1. INSERT INTO tabla_nueva_sin_duplicados
  2. (
  3. SELECT * FROM tabla_vieja
  4. GROUP BY cve,ide,nombre
  5. )
Otra opción, igual ... a ver si alguien la agarra :

Código:
create table data_temp like data1;
insert into data_temp select distinct * from data1;
drop table data1;
alter table data_temp rename to data1;
Con el problema que si el 'nombre' difiere siempre van a seguir duplicados, una mas compleja que solamente toma el primer nombre,

Código:
create table data_temp like data1;

insert into data_temp select distinct cve, ide,
(select nombre from data1 b where a.cve = b.cve and a.ide = b.ide limit 1)
nombre from data1 a;

drop table data1;
alter table data_temp rename to data1;
Recuerda hacer copias de seguridad antes de realizar cualquiera de estos procedimientos,

Saludos,

Etiquetas: dobles, mysql, registros, suprimir
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 13:48.