Restar dos registro en MYSQL

Iniciado por yoelrodguez, 8 Octubre 2014, 16:40 PM

0 Miembros y 1 Visitante están viendo este tema.

yoelrodguez

Hola a todos tengo el siguiente problema,   quiero restar el valor de dos registro distinto que tengo en mysql. Le pongo el ejemplo:

Tabla con el contenido


   
   
   
   
idValor
110
220
330
Lo que quiero hacer es restar 20 - 10 y guardar ese valor y después restar 30 - 20 y guardar ese valor y así sucesivamente.

Si alguien me pudiera ayudar

MinusFour

Código (mysql) [Seleccionar]

UPDATE tabla SET campo3 = campo3 - campo2, campo2 = campo2 - campo1

yoelrodguez

Estuve viendo tu código y muchas gracias pero  lo que pasa es que el nombre de la columna es el mismo siempre y el id me varía de acuerdo si se ha borrado o no el registro.

MinusFour

Ya, me doy cuenta que es una tabla de 2 columnas y lo que quieres es restar valores individuales de las hileras.

Yo creo que para eso vas a necesitar hacer un stored procedure y un loop.

yoelrodguez

Tienes algún ejemplo que me facilites

MinusFour

Código (mysql) [Seleccionar]

DELIMITER //

DROP PROCEDURE `changeVal`
CREATE PROCEDURE `changeVal`()

BEGIN
DECLARE index INT DEFAULT 2;
DECLARE rowCount INT;
DECLARE oldVal INT;

SET count = (SELECT COUNT(*) FROM tabla);

WHILE (rowCount > index) DO
SET oldVal = (SELECT valor FROM tabla WHERE id = rowCount-1);
UPDATE tabla SET valor = valor - oldVal WHERE id = rowCount;
SET rowCount = rowCount -1;
END WHILE
END //


Esto podria funcionar si se preserva el auto_increment. Sino... no se, quizas con limit pero no lo he probado:

Código (mysql) [Seleccionar]
DELIMITER //

DROP PROCEDURE `changeVal`
CREATE PROCEDURE `changeVal`()

BEGIN
DECLARE index INT DEFAULT 2;
DECLARE count INT;
DECLARE oldVal INT;
DECLARE myRow INT;

SET count = (SELECT COUNT(*) FROM tabla);

WHILE (count > index) DO
SET oldVal = (SELECT valor FROM tabla LIMIT 1, count-2);
SET myRow = (SELECT id FROM tabla LIMIT 1, count-1);
UPDATE tabla SET valor = valor - oldVal WHERE id = myRow;
SET count = count - 1;
END WHILE
END //