2016-02-10 4 views
0

j'ai créer une table et insérer des données fictives avec cette requête:MySQL utilisateur variable définie pour chaque ID spesific

CREATE TABLE transaction (
    idtransaction INT NOT NULL AUTO_INCREMENT, 
    idproduct INT NOT NULL, 
    quantity INT NOT NULL, 
    PRIMARY KEY (idtransaction)); 

INSERT INTO transaction (idproduct, quantity) VALUES 
(1, 100), 
(1, 200), 
(2, 120), 
(3, 300), 
(2, 200), 
(2, 200), 
(1, 300); 

et je veux obtenir un résultat de table comme ceci:

|idtransaction| idproduct | quantity | saldo 
    1    1   100  100 
    2    1   100  200 
    3    2   120  120 
    4    3   300  300 
    5    2   200  320 
    6    2   200  520 
    7    1   300  500 

J'ai créer une requête comme ceci:

SELECT idtransaction, 
     idproduct, 
     quantity, 
     (@saldo := @saldo + quantity) as saldo 
FROM transaction 
LEFT JOIN 
    (select @saldo :=0) as s on 1=1; 

mais, le résultat de l'historique de saldo est calculé pour tous les idproduct.

comment obtenir l'histoire 'saldo' pour chaque idproduct?

Répondre

1

Vous devez commander les données par idproduct, puis réinitialiser @saldo chaque fois que idproduct change.

Si vous souhaitez que le résultat final soit commandé par idtransaction, placez la requête avec le total cumulé dans une sous-requête et appliquez la nouvelle commande.

SELECT * 
FROM (
    SELECT idtransaction, idproduct, quantity, 
      @saldo := IF(idproduct = @lastproduct, @saldo + quantity, quantity) AS saldo, 
      @lastproduct := idproduct 
    FROM (SELECT * 
      FROM transaction 
      ORDER BY idproduct, idtransaction) AS t 
    CROSS JOIN (SELECT @saldo := 0, @lastproduct = NULL) AS vars) AS x 
ORDER BY idtransaction 

DEMO