Foros del Web » Programando para Internet » PHP »

eliminar registros duplicados en mysql

Estas en el tema de eliminar registros duplicados en mysql en el foro de PHP en Foros del Web. Estoy haciendo un script y probandolo en mi localhost pero no me corre este es mi script @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original <?php //conecta ...
  #1 (permalink)  
Antiguo 20/03/2011, 08:45
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 23 años, 5 meses
Puntos: 20
No corre mi script

Estoy haciendo un script y probandolo en mi localhost pero no me corre


este es mi script


Código PHP:
Ver original
  1. <?php
  2. //conecta a la base de datos
  3. $conexion = mysql_connect("localhost", "root", "buckdich");
  4. mysql_select_db("correos", $conexion);
  5.  
  6.  
  7.  
  8. $sql = "SELECT * FROM correos";
  9.  
  10. $runsql = mysql_query($sql) or die (mysql_error());
  11.  
  12.     while ($row1 = mysql_fetch_array($runsql){
  13.  
  14.         $email = $row1[0];
  15.  
  16.         //calcula duplicados
  17.  
  18.         $duplicado = "SELECT * FROM correos WHERE email LIKE '$email'";
  19.         $run_duplicado = mysql_query($duplicado) or die (mysql_error());
  20.         $cant_dup = mysql_num_rows ($run_duplicado);
  21.  
  22.         $tot_duplicado = $cant_dup-1;
  23.  
  24.         echo "Existen <b>".$tot_duplicado."</b> Registros duplicados para la direccion de correo <b>".$email."</b>";
  25. }
  26.  
  27.  
  28. ?>

Me da un error 500
__________________
Say no more.......
  #2 (permalink)  
Antiguo 20/03/2011, 08:50
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 9 meses
Puntos: 288
Respuesta: No corre mi script

anda probando
primero la conxion
luego la primer consulta
y despues la ultima consulta

a ver donde esta el error

sacala mysql_error() aveces tira errores incomprensilbles
  #3 (permalink)  
Antiguo 20/03/2011, 09:13
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: No corre mi script

creo que podrias simplificar un poco tu consulta
Código PHP:
Ver original
  1. $query = mysql_query("SELECT COUNT(email) FROM correos GROUP BY email") or die(mysql_error());
de esta manera te va a decir cuantos hay de cada uno y te ahorras el estar haciendo dos consultas, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #4 (permalink)  
Antiguo 20/03/2011, 09:19
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 23 años, 5 meses
Puntos: 20
Respuesta: No corre mi script

ya, el problema estaba en esta linea
while ($row1 = mysql_fetch_array($runsql){

debe quedar asi while ($row1 = mysql_fetch_array($runsql)){

No habia cerrado todos los parentesis
__________________
Say no more.......
  #5 (permalink)  
Antiguo 20/03/2011, 09:24
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 23 años, 5 meses
Puntos: 20
Respuesta: No corre mi script

Cita:
Iniciado por carlos_belisario Ver Mensaje
creo que podrias simplificar un poco tu consulta
Código PHP:
Ver original
  1. $query = mysql_query("SELECT COUNT(email) FROM correos GROUP BY email") or die(mysql_error());
de esta manera te va a decir cuantos hay de cada uno y te ahorras el estar haciendo dos consultas, saludos
Me suena interesante lo que pasa es que necesito sacar de la primera consulta el valor del duplicado para poder eliminar los repetidos, de todos modos mas tarde lo pruebo a ver

gracias
__________________
Say no more.......
  #6 (permalink)  
Antiguo 20/03/2011, 10:25
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 23 años, 5 meses
Puntos: 20
listo ya funciona mi script, o almenos la parte que me da el numero de registros duplicados, lo que necesito ahora es eliminarlos.

para eso he complementado asi
Código PHP:
Ver original
  1. <?php
  2. //conecta a la base de datos
  3. $conexion = mysql_connect("localhost", "root", "buckdich");
  4. mysql_select_db("correos", $conexion);
  5.  
  6.  
  7.  
  8. $sql = "SELECT * FROM correos";
  9.  
  10.  
  11. $runsql = mysql_query($sql) or die (mysql_error());
  12. $registros = mysql_num_rows ($runsql);
  13. echo "Antes de la eliminacion habian <b>".$registros."</b> correos electronicos";
  14.     while ($row1 = mysql_fetch_array($runsql)){
  15.  
  16.         $email = $row1[0];
  17.  
  18.         //calcula duplicados
  19.  
  20.         $duplicado = "SELECT * FROM correos WHERE email LIKE '$email'";
  21.         $run_duplicado = mysql_query($duplicado) or die (mysql_error());
  22.         $cant_dup = mysql_num_rows ($run_duplicado);
  23.  
  24.         $tot_duplicado = $cant_dup-1;
  25.  
  26.         echo "<p>Existen <b>".$tot_duplicado."</b> Registros duplicados para la direccion de correo <b>".$email."</b>";
  27. }
  28.  
  29.          //elimina duplicados
  30.  
  31.         while ($row2 == $tot_duplicado) {
  32.             $elimina = "DELETE FROM correos WHERE email LIKE '$email'";
  33.             $run_elimina = mysql_query($elimina) or die (mysql_error());
  34.  
  35.             echo "  Se eliminaron <b>".$tot_duplicado."</b> registros";
  36. }
  37.  
  38. $sql2 = "SELECT * FROM correos";
  39.  
  40.  
  41. $runsql2 = mysql_query($sql2) or die (mysql_error());
  42. $registros2 = mysql_num_rows ($runsql2);
  43. echo "Despues de la eliminacion quedaron <b>".$registros2."</b> correos electronicos";
  44.  
  45.  
  46. ?>

pero cuando lo corro se queda pegado y no elimina los datos

he construido este script para eliminar registros duplicados en mysql
Código PHP:
Ver original
  1. <?php
  2. //conecta a la base de datos
  3. $conexion = mysql_connect("localhost", "root", "*****");
  4. mysql_select_db("correos", $conexion);
  5.  
  6.  
  7.  
  8. $sql = "SELECT * FROM correos";
  9.  
  10.  
  11. $runsql = mysql_query($sql) or die (mysql_error());
  12. $registros = mysql_num_rows ($runsql);
  13. echo "Antes de la eliminacion habian <b>".$registros."</b> correos electronicos";
  14.     while ($row1 = mysql_fetch_array($runsql)){
  15.  
  16.         $email = $row1[0];
  17.  
  18.         //calcula duplicados
  19.  
  20.         $duplicado = "SELECT * FROM correos WHERE email LIKE '$email'";
  21.         $run_duplicado = mysql_query($duplicado) or die (mysql_error());
  22.         $cant_dup = mysql_num_rows ($run_duplicado);
  23.  
  24.         $tot_duplicado = $cant_dup-1;
  25.  
  26.         echo "<p>Existen <b>".$tot_duplicado."</b> Registros duplicados para la direccion de correo <b>".$email."</b>";
  27. }
  28.  
  29.          //elimina duplicados
  30.  
  31.         while ($row2 == $tot_duplicado) {
  32.             $elimina = "DELETE FROM correos WHERE email LIKE '$email'";
  33.             $run_elimina = mysql_query($elimina) or die (mysql_error());
  34.  
  35.             echo "  Se eliminaron <b>".$tot_duplicado."</b> registros";
  36. }
  37.  
  38. $sql2 = "SELECT * FROM correos";
  39.  
  40.  
  41. $runsql2 = mysql_query($sql2) or die (mysql_error());
  42. $registros2 = mysql_num_rows ($runsql2);
  43. echo "Despues de la eliminacion quedaron <b>".$registros2."</b> correos electronicos";
  44.  
  45.  
  46. ?>

funciona bien hasta el punto de consultar los registros e indicar el numero de duplicados, pero cuando hago la parte para eliminarlos ejecuta el script pero se queda pegado y no hace nada y me da este error Notice: Undefined variable: row2 in /var/www/bd/eliminadup.php on line 31
__________________
Say no more.......

Última edición por GatorV; 21/03/2011 a las 11:16
  #7 (permalink)  
Antiguo 21/03/2011, 10:33
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 10 meses
Puntos: 32
Respuesta: eliminar registros duplicados en mysql

$row2 en ningún momento llega a tener un valor.

Y si además haces "DELETE FROM correos WHERE email LIKE '$email'" borrarás todas la filas que tengan el email en concreto y no dejará ninguna.

Supongo que querrás dejar una fila como mínimo, por lo que tienes que borrar con el criterio de un campo particular de cada fila.
  #8 (permalink)  
Antiguo 21/03/2011, 10:34
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: eliminar registros duplicados en mysql

Pues es obvio, ¿donde asignas $row2?, en el while() estas comparando que $row2 == $tot_duplicado, por eso se queda en un loop infinito.

Saludos.
  #9 (permalink)  
Antiguo 21/03/2011, 10:35
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 23 años, 5 meses
Puntos: 20
Respuesta: eliminar registros duplicados en mysql

pero entonces como podria deinirlo
__________________
Say no more.......
  #10 (permalink)  
Antiguo 21/03/2011, 10:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: eliminar registros duplicados en mysql

Aparte, ¿no te sería más sencillo hacerlo desde SQL?

Algo así:
Código SQL:
Ver original
  1. DELETE
  2.   FROM correos
  3.   WHERE UPPER(email) IN (
  4.     SELECT UPPER(email)
  5.     FROM test
  6.     GROUP BY email
  7.     HAVING (COUNT(*) > 1)
  8.   )
  #11 (permalink)  
Antiguo 21/03/2011, 10:52
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 23 años, 5 meses
Puntos: 20
Respuesta: eliminar registros duplicados en mysql

me parece interesante la instruccion, la acabo de probar pero me pide una tabla test la cree pero tampoco elimina.
__________________
Say no more.......
  #12 (permalink)  
Antiguo 21/03/2011, 10:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: eliminar registros duplicados en mysql

Era un ejemplo, de hecho la tabla debe de ser la misma de los correos, la escribí al vuelo, te recomiendo estudies un poco de SQL, lo que hace esa instrucción es seleccionar todos los correos donde sean duplicados, y luego la consulta del DELETE los borra.

Saludos.
  #13 (permalink)  
Antiguo 21/03/2011, 11:45
Avatar de s00rk  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico
Mensajes: 238
Antigüedad: 14 años
Puntos: 48
Respuesta: eliminar registros duplicados en mysql

Otra cosa que tmb te podria servir esque en las tablas manejes con un ID, asi cuando elimines tengas un identificador y eliminar uno de ellos y no las dos cuentas del mismo email.
  #14 (permalink)  
Antiguo 27/07/2011, 09:05
 
Fecha de Ingreso: septiembre-2009
Ubicación: Queretaro
Mensajes: 51
Antigüedad: 15 años, 1 mes
Puntos: 2
Respuesta: eliminar registros duplicados en mysql

Excelente...

GatorV tu solución usando solo SQL es excelente su planteamiento, y bueno reduce mucho código en php, osea reduce hacer esos loops para seleccionar los duplicados y el loop para borrar los duplicando dejando solo uno de esos duplicados.

y si efectivamente si se va a hacer en php, es buena idea manejar los ID's como comenta s00rk...

y tmb hay q estudiar un poco mas el SQL y php, estoy de acuerdo que este es un foro para ayudar y solucionar pero no creo tanto q sea para enseñar, ps primero es recomendable leer los manuales que ha muchos compañeros les han costado su tiempo en hacer dicho documento y ya después de tener un conocimiento mas solido ahora si a operar el foro. Si estoy equivocado en mi forma de pensar les pido una disculpa y corrijan me pls.
  #15 (permalink)  
Antiguo 27/07/2011, 13:59
 
Fecha de Ingreso: septiembre-2009
Ubicación: Queretaro
Mensajes: 51
Antigüedad: 15 años, 1 mes
Puntos: 2
Respuesta: eliminar registros duplicados en mysql

Esta es la solucion que yo utilice juntando MySQL y php y esta solucion junta aun un modificador mas... borra los registros duplicados dentro de grupos dejando solo un registro por grupo.


Código PHP:
ini_set('max_execution_time',0);

print 
"<h2>Borrando duplicados...</h2>";   

$dele 0
$sql mysql_query("SELECT * FROM ".$DBprefix."newsletter GROUP BY grupo ;")or print mysql_error();                       
while (
$row mysql_fetch_array($sql)){
    
$sql2 mysql_query("SELECT * FROM ".$DBprefix."newsletter where grupo = '{$row['grupo']}' GROUP BY address HAVING (COUNT(*) > 1) ;")or print mysql_error();  
        while (
$row2 mysql_fetch_array($sql2)){
            
$sql3 mysql_query("SELECT * FROM ".$DBprefix."newsletter where grupo = '{$row['grupo']}' and address = '{$row2['address']}' ;")or print mysql_error();  
                
$noone 1;
                while (
$row3 mysql_fetch_array($sql3)){    
                    if(
$noone != 1){
                    
$sql4 mysql_query("DELETE FROM ".$DBprefix."newsletter WHERE ID = '{$row3['ID']}';")or print mysql_error();  
                    
$dele++; 
                    }  
                    
$noone++;  
                }
        }
}
print 
$dele." fueron borrados."

Etiquetas: duplicados, mysql, registros
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 04:06.