2017-05-18 2 views
0

Ich habe eine Abfrage, die Transaktionshistorie für einen bestimmten Benutzer zurückgibt.Wie berechnet man die Summe der vorhergehenden Zeilen in jeder Zeile in 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 

Ich mag balance das Ergebnis eine neue Spalte hinzuzufügen, die bei nach dieser bestimmten Transaktion des Restbetrag zeigt. Also sollte das obige Ergebnis wie folgt aussehen:

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 

Ich kann dies in PHP erreichen. Aber ich suche nach einer Abfrage, die das gleiche Ergebnis erzeugen kann.

Antwort

0

Sie können so etwas tun, wenn Sie Benutzervariablen zulassen. Ich weiß nicht, ob du es vorher oder nachher hinzufügen willst.

Beachten Sie, dass diese Abfrage nicht getestet

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 

Wenn Sie nicht über Benutzervariablen erlauben haben den Tisch, an dem w2.ID < w1.currentid beizutreten. IFNULL ist für den ersten Datensatz, der keinen vorherigen Datensatz hat. Daher möchten Sie nicht NULL als Antwort erhalten, sondern den ersten Betrag.

auch nicht getestet

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 
Verwandte Themen