¿Cómo puedo recorrer todas las filas de una tabla? (MySQL)

Tengo una tabla A y hay una ID de clave principal.

Ahora quiero pasar por todas las filas en A.

Encontré algo así como ‘para cada registro en A’, pero parece que no es así como lo haces en MySQL.

La cosa es para cada fila que quiero tomar un campo y transformarlo, insertarlo en otra tabla y luego actualizar algunos de los campos de la fila. Puedo poner la parte seleccionada y el inserto en una sola statement, pero no sé cómo obtener la actualización allí también. Entonces quiero hacer un bucle. Y para la práctica no quiero usar nada más que MySQL.

editar

Agradecería un ejemplo.

Y una solución que no necesita ser puesta en un procedimiento.

editar 2

bien piense en este escenario:

Tabla A y B, cada una con los campos ID y VAL.

Ahora este es el pseudo código para lo que quiero hacer:

for(each row in A as rowA) { insert into B(ID, VAL) values(rowA[ID], rowA[VAL]); } 

básicamente copiando el contenido de A en B usando un bucle.

(Esto es solo un ejemplo simplificado, por supuesto, no usaría un bucle para esto).}

Dado que la sugerencia de un bucle implica la solicitud de una solución de tipo de procedimiento. Aquí esta el mio.

Cualquier consulta que trabaje en cualquier registro individual tomado de una tabla se puede envolver en un procedimiento para hacer que se ejecute a través de cada fila de una tabla de la siguiente manera:

 DROP PROCEDURE IF EXISTS ROWPERROW; DELIMITER ;; 

Entonces aquí está el procedimiento según su ejemplo (table_A y table_B utilizados para mayor claridad)

 CREATE PROCEDURE ROWPERROW() BEGIN DECLARE n INT DEFAULT 0; DECLARE i INT DEFAULT 0; SELECT COUNT(*) FROM table_A INTO n; SET i=0; WHILE i 

Entonces no te olvides de restablecer el delimitador

 DELIMITER ; 

Y ejecuta el nuevo procedimiento

 CALL ROWPERROW(); 

Puede hacer lo que quiera en la línea "INSERT INTO" que simplemente copié de su solicitud de ejemplo.

Tenga en cuenta CUIDADOSAMENTE que la línea "INSERT INTO" que se usa aquí refleja la línea en la pregunta. Según los comentarios a esta respuesta, debe asegurarse de que su consulta sea sintácticamente correcta para cada versión de SQL que esté ejecutando.

En el caso simple en que su campo ID se incrementa y comienza en 1, la línea en el ejemplo podría convertirse en:

 INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A WHERE ID=i; 

Reemplazar la línea "SELECT COUNT" con

 SET n=10; 

Le permitirá probar su consulta en los primeros 10 registros en la tabla_A solamente.

Una última cosa. Este proceso también es muy fácil de anidar en diferentes tablas y era la única forma en que podía llevar a cabo un proceso en una tabla que insertaba dinámicamente diferentes números de registros en una nueva tabla desde cada fila de una tabla padre.

Si necesita que se ejecute más rápido, entonces asegúrese de establecerlo en función, de lo contrario, está bien. También puede volver a escribir lo anterior en forma de cursor, pero puede no mejorar el rendimiento. p.ej:

 DROP PROCEDURE IF EXISTS cursor_ROWPERROW; DELIMITER ;; CREATE PROCEDURE cursor_ROWPERROW() BEGIN DECLARE cursor_ID INT; DECLARE cursor_VAL VARCHAR; DECLARE done INT DEFAULT FALSE; DECLARE cursor_i CURSOR FOR SELECT ID,VAL FROM table_A; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cursor_i; read_loop: LOOP FETCH cursor_i INTO cursor_ID, cursor_VAL; IF done THEN LEAVE read_loop; END IF; INSERT INTO table_B(ID, VAL) VALUES(cursor_ID, cursor_VAL); END LOOP; CLOSE cursor_i; END; ;; 

Recuerde declarar las variables que usará del mismo tipo que las de las tablas consultadas.

Mi consejo es ir con consultas establecidas cuando pueda, y solo usar bucles simples o cursores si es necesario.

Realmente debería usar una solución basada en conjunto que involucre dos consultas (inserción básica):

 INSERT INTO TableB (Id2Column, Column33, Column44) SELECT id, column1, column2 FROM TableA UPDATE TableA SET column1 = column2 * column3 

Y para tu transformación:

 INSERT INTO TableB (Id2Column, Column33, Column44) SELECT id, column1 * column4 * 100, (column2 / column12) FROM TableA UPDATE TableA SET column1 = column2 * column3 

Ahora bien, si su transformación es más complicada e involucra múltiples tablas, publique otra pregunta con los detalles.

CURSORES son una opción aquí, pero en general son mal vistos ya que a menudo no hacen el mejor uso del motor de consultas. Considere investigar ‘SET Based Queries’ para ver si puede lograr lo que quiere hacer sin usar un CURSOR.

  Use this: $stmt = $user->runQuery("SELECT * FROM tbl WHERE ID=:id"); $stmt->bindparam(":id",$id); $stmt->execute(); $stmt->bindColumn("a_b",$xx); $stmt->bindColumn("c_d",$yy); while($rows = $stmt->fetch(PDO::FETCH_BOUND)) { //---insert into new tble }