如何计算MySQL中每行的前一行总和?

时间:2017-05-18 15:21:29

标签: php mysql

我有一个查询,它返回特定用户的交易记录。

SELECT amount, type, date FROM wallet WHERE user_id = 1 ORDER BY date DESC

amount  type              date           
100.00  debit             2017-05-18 18:46:32  
10.00   debit             2017-05-18 17:51:16   
50.00   debit             2017-05-18 17:44:58  
50.00   debit             2017-05-18 17:44:08  
50.00   credit            2017-05-18 17:42:58  
100.00  credit            2017-05-18 17:42:46  
100.00  credit            2017-05-18 17:42:23 

我想在结果中添加一个新列balance,显示该特定交易之后的余额金额。所以上面的结果应该是这样的:

amount  type              date                 balance    
100.00  debit             2017-05-18 18:46:32  40.00    
10.00   debit             2017-05-18 17:51:16  140.00  
50.00   debit             2017-05-18 17:44:58  150.00  
50.00   debit             2017-05-18 17:44:08  200.00  
50.00   credit            2017-05-18 17:42:58  250.00    
100.00  credit            2017-05-18 17:42:46  200.00    
100.00  credit            2017-05-18 17:42:23  100.00

我可以用PHP实现这一点。但我正在寻找一个可以产生相同结果的查询。

1 个答案:

答案 0 :(得分:0)

如果您允许用户变量,则可以执行此类操作。我不知道你是想事先还是事后添加它。

请注意,此查询未经过测试

SET @balance = (SELECT basebalance FROM wallet WHERE user_id=1);

SELECT amount, 
       type, 
       date, 
       @balance as currentbalance, 
       @balance:=IF(type='debit', @balance + amount, @balance - amount) as newbalance 
FROM wallet 
WHERE user_id = 1 
ORDER BY date DESC

如果您不允许用户变量,则必须加入表格,其中w2.ID< w1.currentid。 IFNULL是第一个没有先前记录的记录。因此,您不希望获得NULL作为响应,但是第一个数量。

也未经过测试

 SELECT w1.amount, 
       w1.type, 
       w1.date, 
       w1.amount + IFNULL(SUM(IF(type='credit', w2.amount * -1, w2.amount)), 0) as balance
FROM wallet w1
LEFT JOIN wallet w2 ON w1.user_id=w2.user_id AND w2.id < w1.id
WHERE w1.user_id = 1 
GROUP BY w1.id
ORDER BY w1.date DESC