Ir al contenido


Foto

Eliminar multiples registros mysql


  • Por favor identifícate para responder
19 respuestas en este tema

#1 tumbero_x

tumbero_x

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 19 diciembre 2011 - 04:33

Hola Compañeros!!!
tengo esta consulta y la verdad no se que puede ser , porque lo que hace es eliminarme toda la tabla y no lo que le digo

$sql4=mysql_query("SELECT M.marca_id, M.marca_detalle FROM marcas M",Conectar::con())or die (mysql_error()) ;
while($row=mysql_fetch_array($sql4))
{
mysql_query("DELETE FROM manufacturer WHERE manufacturer_id != ".$row['marca_id'],Conectarse::remota());
}

si pongo un echo , me tira bien los registros de $row['marca_id']
que puede ser si los registros que traigo estan perfectos?
saludos y muchas gracias por su tiempo
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 diciembre 2011 - 08:16

Pues tal como esta si te borra todos los registros, ya que en el SELECT lo traes todos, debes especificar en el Select  los registros que quieres borrar.

Saludos.
  • 0

#3 tumbero_x

tumbero_x

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 20 diciembre 2011 - 08:20

Hola enecumene
gracias por contestar
lo que necesito es eso mismo que elimine las filas donde  manufacturer_id != ".$row['marca_id']
crei que dentro del while lo iba a hacer pero se me acabaron los recursos(que son pocos) y no tengo idea de como lograrlo
gracias por ayudarme

  • 0

#4 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 20 diciembre 2011 - 08:27

Prueba eliminando los registros directamente con una consulta SQL y no con el while. Algo asi:

mysql_query("DELETE FROM manufacturer WHERE manufacturer_id NOT IN (SELECT marca_id FROM marcas)",Conectarse::remota()); 


  • 0

#5 tumbero_x

tumbero_x

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 20 diciembre 2011 - 08:28

AAAAAAAAAAAHHH!!!
ya lo pruebo
gracias Saludos
  • 0

#6 tumbero_x

tumbero_x

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 20 diciembre 2011 - 08:44

casi lo tengo!!!
pero como hago ,porque marcas, esta en otra base de datos
con otra conexion
mysql_query("DELETE FROM manufacturer WHERE manufacturer_id NOT IN (SELECT marca_id FROM marcas (COMO TRAIGO LOS DATOS))",Conectarse::remota());
primero me conecto a la bd que tiene marcas. traigo los registros , los guardo en un array y despues.... como haria?
Muchas gracias
  • 0

#7 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 20 diciembre 2011 - 09:01

Con MySQL puedes referenciar a otra base de datos:

mysql_query("DELETE FROM `bd1`.manufacturer WHERE manufacturer_id NOT IN (SELECT marca_id FROM `bd2`.marcas)",Conectarse::remota());


Donde bd1 y bd2 son los nombres de las base de datos que usas, es decir; los tienes que reemplazar por los nombres de tus bases de datos.
  • 0

#8 tumbero_x

tumbero_x

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 20 diciembre 2011 - 09:32

ya lo hice como me indicaste pero no hace nada
este es mi codigo
$sql4=mysql_query("SELECT M.marca_id, M.marca_detalle FROM marcas M",Conectar::con())or die (mysql_error()) ;
$array4=array();
while($fila4=mysql_fetch_array($sql4))
{
$array4[$fila4['marca_id']] = $fila4['marca_detalle'];
}

$sql5 = mysql_query("SELECT MR.manufacturer_id FROM manufacturer MR",Conectarse::remota())or die (mysql_error()) ;
$array5=array();
while($fila5=mysql_fetch_array($sql5))
{
$array5[$fila5['manufacturer_id']] = $fila5['manufacturer_id'];
}
mysql_query("DELETE FROM MR.manufacturer WHERE MR.manufacturer_id NOT IN (SELECT M.marca_id FROM M.marcas)",Conectarse::remota());

me podrias indicar en donde tengo el error?
Gracias por tu paciencia
  • 0

#9 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 20 diciembre 2011 - 09:38

Debes colocar el nombre de la base de datos entre estas comillas `mi_bd`:

mysql_query("DELETE FROM `MR`.manufacturer WHERE manufacturer_id NOT IN (SELECT marca_id FROM `M`.marcas)",Conectarse::remota());



  • 0

#10 tumbero_x

tumbero_x

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 20 diciembre 2011 - 09:47

No, no hay caso , no puedo eliminar las filas de manufaturer que NO contiene la tabla marcas
ya probe todas las posibilidades que estan a mi alcance
tenes alguna idea que puedo hacer?
Gracias
pongo todo el codigo
$sql4=mysql_query("SELECT M.marca_id, M.marca_detalle FROM marcas M",Conectar::con())or die (mysql_error()) ;
$array4=array();
while($fila4=mysql_fetch_array($sql4))
{
$array4[$fila4['marca_id']] = $fila4['marca_detalle'];
}

$sql5 = mysql_query("SELECT MR.manufacturer_id FROM manufacturer MR",Conectarse::remota())or die (mysql_error()) ;
$array5=array();
while($fila5=mysql_fetch_array($sql5))
{
$array5[$fila5['manufacturer_id']] = $fila5['manufacturer_id'];
}

foreach($array4 as $id => $detalle)

{
if($id == $array5[$id])
{
mysql_query("UPDATE manufacturer SET  name='".$detalle."' WHERE manufacturer_id = ".$id,Conectarse::remota())or die (mysql_error()) ;
}
else
{
mysql_query("INSERT INTO manufacturer VALUES('".$id."','".$detalle."','','0')",Conectarse::remota())or die (mysql_error());

}


}
mysql_query("DELETE FROM `MR`.manufacturer WHERE manufacturer_id NOT IN (SELECT marca_id FROM `M`.marcas)",Conectarse::remota());

lo unico que me faltaria es eso , poder eliminar las filas que estan en manufacturer y No en marcas
Saludos y gracias nuevamente por cualquier ayuda que puedas brindarme
  • 0

#11 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 20 diciembre 2011 - 10:03

Creo que la relación como lo planteas esta mal. No conozco tu BD pero en tu tabla "manufacturer" tiene que haber un campo que se relacione con la tabla "marcas" y es por ese campo que debes de hacer el filtro. Ejm:

DELETE FROM `MR`.manufacturer WHERE marca_id NOT IN (SELECT marca_id FROM `M`.marcas)


Con eso le estamos diciendo que borre todos los registros de la tabla "manufacturer" donde la marca no se encuentre en la tabla de "marcas"

Si este no es el caso. Entonces prueba la sentencia SQL directamente en la base de datos.

Tambien puedes realizar un SELECT para ver cuales son los registros que no están en la tabla de marcas:

SELECT * FROM `MR`.manufacturer WHERE manufacturer_id NOT IN (SELECT marca_id FROM `M`.marcas)


Revisa bien tu E-R y que es realmente lo que quieres borrar.


  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 diciembre 2011 - 10:04

Yo creo que el asunto esta mal planteado pues, me parece que los id de la tabla local debera cargarse en un array y de ahi hacer la comparacion con los datos del remoto, eso creo yo.

Saludos.
  • 0

#13 tumbero_x

tumbero_x

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 20 diciembre 2011 - 10:18

Gracias a todos por ayudarme pero si explico que quiero hacer por ahi se entiende mejor y me dan una idea diferente a la que estoy realizando
tengo una pequeña aplicacion local y un carrito de compras en internet
yo necesito actualizar el carrito de compras con los regiostros de la base de datos local
lo primero que pense es por ejemplo vaciar la tabla manufacturer despues hacer un select a marcas en la base de datos local y volver a llenarla, si en local algun registro de la tabla
marcas se modifico , se elimino o se inserto , estos van a estar igual que en la tabla remota
pero en un foro me dijeron de esta forma , NI LOCO VACIES UNA TABLA PARA DESPUES VOLVER A LLENARLA
y como mi experiencia es poca , me puse a pensar en otra solucion
UStedes que me recomiendan 
vacio la tabla y despues la lleno?
Muchas gracias!!!
  • 0

#14 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 20 diciembre 2011 - 10:21

Yo creo que el asunto esta mal planteado pues, me parece que los id de la tabla local debera cargarse en un array y de ahi hacer la comparacion con los datos del remoto, eso creo yo.

Saludos.


En efecto, eso es lo que se hace con el IN, se compara contra un array directamente en la base de datos.
Ejm:
DELETE FROM `MR`.manufacturer WHERE manufacturer_id NOT IN (SELECT marca_id FROM `M`.marcas)

es igual a
DELETE FROM `MR`.manufacturer WHERE manufacturer_id NOT IN (1, 2, 3)

  • 0

#15 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 diciembre 2011 - 10:24

Si amigo BigLeaguer, eso esta bien siempre y cuando las dos tablas o BD se encuentran en un mismo sitio con los mismo parametros de coneccion, en el caso de tumbero no es asi, si no, dos BD uno remoto y el otro local, o sea, cada uno tiene sus propios parametros de coneccion y de seguro son diferentes.

Saludos.
  • 0

#16 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 20 diciembre 2011 - 10:28

Gracias a todos por ayudarme pero si explico que quiero hacer por ahi se entiende mejor y me dan una idea diferente a la que estoy realizando
tengo una pequeña aplicacion local y un carrito de compras en internet
yo necesito actualizar el carrito de compras con los regiostros de la base de datos local
lo primero que pense es por ejemplo vaciar la tabla manufacturer despues hacer un select a marcas en la base de datos local y volver a llenarla, si en local algun registro de la tabla
marcas se modifico , se elimino o se inserto , estos van a estar igual que en la tabla remota
pero en un foro me dijeron de esta forma , NI LOCO VACIES UNA TABLA PARA DESPUES VOLVER A LLENARLA
y como mi experiencia es poca , me puse a pensar en otra solucion
UStedes que me recomiendan 
vacio la tabla y despues la lleno?
Muchas gracias!!!


Puedes usar un INSERT ... ON DUPLICATE:

INSERT INTO manufacturer (campo1, campo2, campoN)  VALUES (valor1 , valor2, valorN) ON DUPLICATE KEY UPDATE campo1 = valor1, campo2 = valor2, campo3 = valor3


Asi cuando trates de ingresar un registro que ya existe en la tabla, automáticamente te actualiza los datos.

Espero te sirva
  • 0

#17 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 20 diciembre 2011 - 10:31

Si amigo BigLeaguer, eso esta bien siempre y cuando las dos tablas o BD se encuentran en un mismo sitio con los mismo parametros de coneccion, en el caso de tumbero no es asi, si no, dos BD uno remoto y el otro local, o sea, cada uno tiene sus propios parametros de coneccion y de seguro son diferentes.

Saludos.


Eso es correcto, pensaba que las 2 base de datos estaban en el mismo servidor ;)
  • 0

#18 tumbero_x

tumbero_x

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 20 diciembre 2011 - 10:45

Amigo bigleaguer , probe  el codigo que me indicaste y sigo sin poder resolverlo

coloco el codigo para ver si me podes ayudar a buscar el error (no tira ninguno igual)

$sql4=mysql_query("SELECT M.marca_id, M.marca_detalle FROM marcas M",Conectar::con())or die (mysql_error()) ;
$array4=array();
while($fila4=mysql_fetch_array($sql4))
{
$array4[$fila4['marca_id']] = $fila4['marca_detalle'];
}

$sql5 = mysql_query("SELECT R.manufacturer_id FROM manufacturer R",Conectarse::remota())or die (mysql_error()) ;
$array5=array();
while($fila5=mysql_fetch_array($sql5))
{
$array5[$fila5['manufacturer_id']] = $fila5['manufacturer_id'];
}

foreach($array4 as $id => $detalle)

{
mysql_query("INSERT INTO manufacturer (manufacturer_id,name)VALUES('".$id."','".$detalle."') ON DUPLICATE KEY UPDATE manufacturer_id = '".$id."', name= '".$detalle,Conectarse::remota());

}

  • 0

#19 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 20 diciembre 2011 - 11:57

Amigo bigleaguer , probe  el codigo que me indicaste y sigo sin poder resolverlo

coloco el codigo para ver si me podes ayudar a buscar el error (no tira ninguno igual)

$sql4=mysql_query("SELECT M.marca_id, M.marca_detalle FROM marcas M",Conectar::con())or die (mysql_error()) ;
$array4=array();
while($fila4=mysql_fetch_array($sql4))
{
$array4[$fila4['marca_id']] = $fila4['marca_detalle'];
}

$sql5 = mysql_query("SELECT R.manufacturer_id FROM manufacturer R",Conectarse::remota())or die (mysql_error()) ;
$array5=array();
while($fila5=mysql_fetch_array($sql5))
{
$array5[$fila5['manufacturer_id']] = $fila5['manufacturer_id'];
}

foreach($array4 as $id => $detalle)

{
mysql_query("INSERT INTO manufacturer (manufacturer_id,name)VALUES('".$id."','".$detalle."') ON DUPLICATE KEY UPDATE manufacturer_id = '".$id."', name= '".$detalle,Conectarse::remota());

}


Que problema tienes exactamente?
Creo que te faltó cerrar las comillas ' y no es necesario que actualices el campo campo clave (manufacturer_id):
mysql_query("INSERT INTO manufacturer (manufacturer_id, name)VALUES('".$id."','".$detalle."') ON DUPLICATE KEY UPDATE name= '".$detalle."'",Conectarse::remota());

  • 0

#20 tumbero_x

tumbero_x

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 20 diciembre 2011 - 12:01

AHORA SIIII!!!!
muchas gracias por todo el tiempo que me han brindado
Saludos!!!
  • 0




IP.Board spam blocked by CleanTalk.