我有一个查询,它返回特定用户的交易记录。
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实现这一点。但我正在寻找一个可以产生相同结果的查询。
答案 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