Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Bucles anidados

Estas en el tema de Bucles anidados en el foro de Mysql en Foros del Web. Espero sea correcto este tema sea aqui: Requiero recorrer las filas de una tabla, en cada fila leída debo realizar un cálculo, el cual debo ...
  #1 (permalink)  
Antiguo 20/11/2011, 20:46
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Bucles anidados

Espero sea correcto este tema sea aqui:

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.

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. }

Gracias anticipadas.
  #2 (permalink)  
Antiguo 20/11/2011, 20:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Bucles anidados

Lo que estás haciendo es equivalente a:
Código MySQL:
Ver original
  1. INSERT INTO tabla2 (total)
  2. SELECT SUM(importe* 2) FROM tabla1;
Especialmente porque en realidad el valor de la columna "Llave" no lo estás usando para nada.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 20/11/2011, 21:07
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Bucles anidados

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Lo que estás haciendo es equivalente a:
Código MySQL:
Ver original
  1. INSERT INTO tabla2 (total)
  2. SELECT SUM(importe* 2) FROM tabla1;
Especialmente porque en realidad el valor de la columna "Llave" no lo estás usando para nada.
Gracias por tu comentario.

Lo que he escrito es una representación sencilla de lo que deseo resolver. Realmente deseo resolver las instrucciones anidadas, me es necesario resolver bajo este modelo.

El campo LLAVE lo eliminaré para no crear confusión, pero requiero hacer el INSERT dentro del SELECT, me es necesario saber como se resuelve esta situación. Lo represento con el siguiente código:

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

En la realidad mi requerimiento es más complejo que multiplicar *2, pero como he dicho, lo anterior es una representación que he tratado de mostrar para ejemplificar mi necesidad.

Agradezco tu valiosa ayuda.

Saludos.

Última edición por Bier; 20/11/2011 a las 21:08 Razón: Mostrar etiqueta en PHP para facilitar su lectura
  #4 (permalink)  
Antiguo 20/11/2011, 21:10
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Bucles anidados

Complementando:
Requiero saber como recorrer una tabla con un SELECT y al leer cada fila, poder realizar: INSERT, UPDATE a una segunda tabla.

Gracias nuevamente
  #5 (permalink)  
Antiguo 20/11/2011, 21:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Bucles anidados

Si tu problema es desde la optica de programación en un lenguaje, no es este el foro donde debes preguntar eso. Cada lenguaje tiene su propio foro y esas preguntas se responden allí (Normas del Foro de Bases de Datos).
A nivel de SQL, la consulta que te indiqué (INSERT... SELECT...) realiza precisamente esa tarea, solo que lo hace en una sola sentencia, con la salvedad de que un UPDATE es una sentencia completamente diferente, y se debe realizar con una sintaxis distinta. En definitiva, esa sintaxis crea una tabla derivada con el resultado de la suma y luego lo inserta en la tabla indicada. Nada más.

En SQL uno trata de no realizar procesos iterativos a menos que sean absolutamente necesarios porque consumen innecesariamente recursos, y no son optimizables. Además, cuando se deben hacer, se realizan por medio de stored procedures, y no con simples consultas, ya que requieren el uso de cursores, handlers y variables locales de MySQL.
Por lo demás, ¿para qué hacer un proceso iterativo, donde el DBMS puede encargarse de la tarea con una sola consulta?

Resumiendo: Si tu pregunta es cómo hacerlo en PHP, estás en el foro equivocado. Si quieres hacerlo en SQL, olvídate del PHP y empecemos a hablar de PL/SQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 20/11/2011 a las 21:28
  #6 (permalink)  
Antiguo 20/11/2011, 21:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Bucles anidados

Releyendo tu primera respuesta pienso que estás tratando de hacer un planteo genérico para algo que luego probablemente no lo sea.
¿Por qué no planteas el caso real. Es probable (ya ha pasado), que viendo el caso en que vas a usarlo, las respuestas sean más exactas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 20/11/2011, 21:52
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Bucles anidados

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Desde la optica de programación en un lenguaje, no es este el foro donde debes preguntar eso. Cada lenguaje tiene su propio foro y esas preguntas se responden allí (Normas del Foro de Bases de Datos).
A nivel de SQL, la consulta que te indiqué (INSERT... SELECT...) realiza precisamente esa tarea, solo que lo hace en una sola sentencia, con la salvedad de que un UPDATE es una sentencia completamente diferente, y se debe realizar con una sintaxis distinta.

En SQL uno trata de no realizar procesos iterativos a menos que sean absolutamente necesarios porque consumen innecesariamente recursos, y no son optimizables. Además, cuando se deben hacer, se realizan por medio de stored procedures, y no con simples consultas, ya que requieren el uso de cursores, handlers y variables locales de MySQL.
Por lo demás, ¿para qué hacer un proceso iterativo, donde el DBMS puede encargarse de la tarea con una sola consulta?

Resumiendo: Si tu pregunta es cómo hacerlo en PHP, estás en el foro equivocado. Si quieres hacerlo en SQL, olvídate del PHP y empecemos a hablar de PL/SQL.
Bien, agradezco tu tiempo, trataré de plantear mi necesidad de otra forma.
  1. Tengo la tabla1 MySQL con 1 millón de filas y cada fila con varios campos.
  2. Debo leer cada fila de esta tabla1, y de acuerdo a ciertos valores almacenados en los campos de cada fila, realizar operaciones diversas con la información contenida.
  3. Los resultados de las operaciones y dependiendo de diversas variables, en algunas veces deberé almacenar en una tabla2 ya sea con INSERT o UPDATE. En algunos casos el resultado de fila no me será relevante y no lo almacenaré.
  4. Puede darse el caso de algunos resultados que deba almacenarlos en una tabla3 (con INSERT o UPDATE).
  5. Como resultado, tabla2 podría llegar a 400 mil filas y tabla3 a 100 filas.
  6. Las tablas: 2 y 3 vendrían a ser resumenes de información de tabla1.

Yo imaginé hacer un lo siguiente:
  1. select a la tabla1
  2. Dentro del WHILE realizar los cálculos necesarios
  3. En base a los resultados, determinar si debo INSERTAR una nueva fila a la tabla2 o hacer un UPDATE.
  4. Puede darse el caso de requerir INSERTAR o UPDATE incluso a tabla3 y/o tabla4.

Mi pregunta específica:
¿Es posible tener un SELECT, y dentro del WHILE poder tener INSERT o UPDATE a una tabla2, tabla3, tabla4, etc.?

Agradezco la ayuda para que yo pueda entender lo anterior.
He buscado en Google, y hay varios planteamientos a esta pregunta, curiosamente en todos los que he leído siempre han quedado sin respuesta.

En algún mensaje leí que esto solo encuentra soportado a partir de MySQL5, por lo que me atreví a preguntar, por si alguien ha requerido resolver una necesidad similar a mi requerimiento.

Gracias nuevamente.
  #8 (permalink)  
Antiguo 20/11/2011, 22:04
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Bucles anidados

Creo estoy en el foro equivocado, Gracias por tus ayudas, han sido muy valiosas.
Si alguien llega por aquí y tiene respuesta de PHP lo agradeceré.
Voy a PHP.

Agradezco la gentileza.
Saludos
  #9 (permalink)  
Antiguo 20/11/2011, 22:33
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Bucles anidados

Corrección: La solución que requiero es de PHP, MySQL no tiene nada que ver en lo anterior.

Saludos
  #10 (permalink)  
Antiguo 21/11/2011, 17:20
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Bucles anidados

Como bien lo dijo gnzsoloyo, este era el foro equivocado para la pregunta planteada, más bien es para PHP.
Si se puede anidar INSERT dentro de un SELECT.

Este es el hilo con la solución en el foro PHP:
http://www.forosdelweb.com/f18/anida...-mysql-959172/

Muy agradecido por la ayuda.

Etiquetas: anidados, bucles, query, select, sql, tabla
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 14:07.