Foros del Web » Programando para Internet » PHP »

Anidar UPDATE dentro de un SELECT (PHP/MySQL)

Estas en el tema de Anidar UPDATE dentro de un SELECT (PHP/MySQL) en el foro de PHP en Foros del Web. Requiero recorrer las filas de una tabla, en cada fila leída debo realizar un cálculo, el cual debo almacenar en una segunda tabla. Trataré de ...
  #1 (permalink)  
Antiguo 20/11/2011, 19:21
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Anidar UPDATE dentro de un SELECT (PHP/MySQL)

Requiero recorrer las filas de una tabla, en cada fila leída debo realizar un cálculo, el cual debo almacenar en una segunda tabla.

Trataré de explicarme:

Tengo esta consulta y trabaja perfecto:
Código PHP:
Ver original
  1. $consulta = mysql_query("SELECT llave, importe FROM tabla1", $link) or die ("Error");
  2.            while ($fila = mysql_fetch_row($consulta)) {
  3.            $llave= $fila[0];
  4.            $total = $fila[1] * 2 ;
  5. }

Por cada fila leída, debo almacenar su resultado en una segunda tabla con un INSERT, algo así:
Código PHP:
Ver original
  1. $consulta = "INSERT INTO tabla2 (total) VALUES ('$total ')";
  2. $resultado = mysql_query($consulta) or die ("Error");


¿Como puedo hacer las dos funciones anteriores de manera simultánea?
Deseo leer una fila de la tabla1 y grabar a la tabla2, así hasta recorrer todas las filas de la tabla1

Imaginé hacer algo así: (Anidando código)
Código PHP:
Ver original
  1. $consulta = mysql_query("SELECT llave, importe FROM tabla1", $link) or die ("Error");
  2.            while ($fila = mysql_fetch_row($consulta)) {
  3.            $llave= $fila[0];
  4.            $total = $fila[1] * 2 ;
  5.  
  6.      $consulta = "INSERT INTO tabla2 (total) VALUES ('$total ')";
  7.      $resultado = mysql_query($consulta) or die ("Error");
  8. }

Disculpen la pregunta, pero no he encontrado una solución por más búsquedas que he realizado.

Gracias anticipadas.
  #2 (permalink)  
Antiguo 20/11/2011, 23:54
Avatar de jorgelpadronb  
Fecha de Ingreso: agosto-2011
Ubicación: Cuba
Mensajes: 281
Antigüedad: 12 años, 8 meses
Puntos: 37
Respuesta: Anidar UPDATE dentro de un SELECT (PHP/MySQL)

Saludos. Bien, ese procedimiento anidado que pones es la solución. Entonce, cual es el problema, que no funciona?

Si no funciona probablemente es porque tienes un error en la SQL del INSERT.

$consulta = "INSERT INTO tabla2 (total) VALUES ('$total ')";

Fíjate que en la cláusula VALUES especificas el valor de $total en tre comillas. Las comillas se usan solo si el valor es un string, lo cual no es el caso. Ponlo así:

$consulta = "INSERT INTO tabla2 (total) VALUES ($total )";

Espero que te ayude.
  #3 (permalink)  
Antiguo 21/11/2011, 00:31
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Anidar UPDATE dentro de un SELECT (PHP/MySQL)

Mi tabla1 tiene 10 filas, si ejecuto lo siguiente recorre las 10 filas correctamente:
Código PHP:
Ver original
  1. $consulta = mysql_query("SELECT llave, importe FROM tabla1", $link) or die ("Error");
  2.            while ($fila = mysql_fetch_row($consulta)) {
  3.            $llave= $fila[0];
  4.            $total = $fila[1] * 2 ;
  5. echo $llave."<br>";
  6. }

Pero al agregar la instrucción del INSERT (de la siguiente forma), entonces el WHILE solo se realiza para la fila 1, ignorando a las siguientes 9 filas, o sea que al ser ejecutado el INSERT se sale del WHILE.
Código PHP:
Ver original
  1. $consulta = mysql_query("SELECT llave, importe FROM tabla1", $link) or die ("Error");
  2.            while ($fila = mysql_fetch_row($consulta)) {
  3.            $llave= $fila[0];
  4.            $total = $fila[1] * 2 ;
  5. echo $llave."<br>";
  6.  
  7.      $consulta = "INSERT INTO tabla2 (total) VALUES ('$total')";
  8.      $resultado = mysql_query($consulta) or die ("Error");
  9. }

No se como se realiza un INSERT dentro de un WHILE anidado, en otros lenguajes que conozco si se puede, en PHP lo ignoro. Me he asombrado por muchas poderosas instrucciones de PHP que superan a otros "poderosos" lenguajes, por lo que seguro estoy que se debe poder resolver lo que requiero.

En calidad temporal estoy resolviendo mi necesidad con variables de memoria, pero se que no es lo mejor. Cuando logre resolver que un INSERT pueda estar dentro del WHILE seré felíz.

Este planteamiento que requiero es "el pan de cada día" en sistemas administrativos, me llama la atención que nadie me haya aportado alguna idea, no es obligación, pero en otras ocasiones he preguntado y me llega una lluvia de ideas, las cuales siempre agradezco, que ahora no ha sido el caso. ¿Acaso nadie lo ha requerido nunca? ¿Acaso mi planteamiento es incorrecto o no me expliqué? Quiero imaginar que es fin de semana.

Gracias por tu comentario, lo agradezco.
  #4 (permalink)  
Antiguo 21/11/2011, 00:32
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Anidar UPDATE dentro de un SELECT (PHP/MySQL)

NOTA: El INSERT trabaja perfecto fuera del WHILE, solo que no funciona al estar dentro del WHILE.

De todas formas veré lo que indicas.
Saludos
  #5 (permalink)  
Antiguo 21/11/2011, 01:09
Avatar de jorgelpadronb  
Fecha de Ingreso: agosto-2011
Ubicación: Cuba
Mensajes: 281
Antigüedad: 12 años, 8 meses
Puntos: 37
Respuesta: Anidar UPDATE dentro de un SELECT (PHP/MySQL)

Entonces vas a tener que pasar el contenido de la tabla a un array con el while. Después recorres el array haciento el insert por cada elemento.

Pruébalo así.
  #6 (permalink)  
Antiguo 21/11/2011, 09:09
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Anidar UPDATE dentro de un SELECT (PHP/MySQL)

Cita:
Iniciado por jorgelpadronb Ver Mensaje
Entonces vas a tener que pasar el contenido de la tabla a un array con el while. Después recorres el array haciento el insert por cada elemento.

Pruébalo así.
Precisamente así lo resolví. Para mi aplicación particular es posible ya que solo serán unas 20 filas, pero ¿y cuando se trata de 1,000,000 de filas? Eso no es posible realizarlo con array.

Es importante conocer como lo realizan otros usuarios cuando se les presenta esta necesidad.

He buscado en decenas de páginas (foros y Google) y esta necesidad la han planteado ya otros usuarios, he leido mensajes solicitando una solución, curiosamente en todos los casos se han quedado sin respuesta. ¿Será posible?

Gracias
  #7 (permalink)  
Antiguo 21/11/2011, 09:15
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Anidar UPDATE dentro de un SELECT (PHP/MySQL)

Antiguamente yo trabajaba en CBasic, el cual no permitía IF's anidados, lo cual me las ingeniaba y resolvía enviando dentro del IF a una subrutina, la cual a su vez tenía un IF, así que ello resolvía los IF´s anidados. Era un truco que ni en los manuales estaba.

Posteriormente evolucionó y en las nuevas versiones ya disponible los IF´s anidados fueron posibles. Afortunadamente PHP si permite IF anidados, pero no puedo tener un INSERT anidado dentro del WHILE de un SELECT.

Esperaré a encontrar una solución o que un forista pueda darme una idea al respecto.

Gracias
  #8 (permalink)  
Antiguo 21/11/2011, 13:00
Avatar de jorgelpadronb  
Fecha de Ingreso: agosto-2011
Ubicación: Cuba
Mensajes: 281
Antigüedad: 12 años, 8 meses
Puntos: 37
Respuesta: Anidar UPDATE dentro de un SELECT (PHP/MySQL)

Ya ya, ya se lo que te está pasando. Fíjate que primero pones el resultado de la consulta del SELECT en la variable $consulta y despues, dentro del while pones la SQL del insert en la variable $consulta también. Estás sobreescribiendo la variable consulta, donde tienes los resultados del SELECT. Por eso nada mas que ejecuta el primer ciclo y ya desaparecen los resultados del SELECT. Utiliza un nombre distinto para alojar la SQL del INSERT. Creo que así va a funcionar. Saludos.
  #9 (permalink)  
Antiguo 21/11/2011, 13:15
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Anidar UPDATE dentro de un SELECT (PHP/MySQL)

Tienes razón, lo probaré. Gracias
  #10 (permalink)  
Antiguo 21/11/2011, 13:34
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Anidar UPDATE dentro de un SELECT (PHP/MySQL)

Estimado jorgelpadronb,

Te informo que ese era el inconveniente, lo he modificado según tu sugerencia y ya trabaja perfecto.

Ahora soy feliz.

Mucho muy agradecido con tu ayuda.

Etiquetas: anidar, mysql, select, tabla, update
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:17.