我正在开发一个关于phpmyadmin mysql的查询,其中我打算显示列的运行余额,说'CurrentBalance'
此列的运行余额取决于活动是存款(+),取款( - ),下注( - ),支付(+)
我提出的是这个
SELECT CONCAT("Trans ID ",`TransactionID`) AS ID,
`DateTime`,`Type` AS Activity, `Amount`, 0 AS Payout,
CASE WHEN (SELECT Activity) = "deposit" THEN `Amount`+ `playerdb`.`CurrentBalance`
ELSE CASE WHEN (SELECT Activity) = "withdraw" OR (SELECT Activity) = "bet"
THEN CASE WHEN (SELECT Payout) >0 THEN (SELECT Payout) + `playerdb`.`CurrentBalance`
ELSE `Amount` - `playerdb`.`CurrentBalance` END END END AS CurrentBalance
FROM `transactiondb` LEFT JOIN `playerdb` ON
`transactiondb`.`PlayerID` = `playerdb`.`PlayerID`
WHERE `transactiondb`.`PlayerID`=10078 UNION ALL
SELECT CONCAT("Bet ID ",`BetID`),`DateTime`,"Bet", `BetAmount`,`Payout`, (SELECT CurrentBalance) FROM `betdb` WHERE `PlayerID`=10078 ORDER BY `DateTime`
理念 http://postimg.org/image/x3fsxq2qz/
在第二个SELECT语句上执行(SELECT CurrentBalance)会产生此错误
1054 - “字段列表”中的未知列'CurrentBalance'
我需要获取前一条记录的CurrentBalance,所以我尝试使用别名
这可能吗?
答案 0 :(得分:1)
这是一个“教人钓鱼......”的答案,因为你的问题对我来说还不是很清楚。
通常,您可以使用变量访问上一行。
看一下这个例子:
SELECT
t.*
, @running_total := IF(@foo != foo, 0, @running_total + bar)
, @foo := foo
FROM a_table t
, (SELECT @running_total := 0, @foo := NULL) variable_initialization_subquery
ORDER BY foo;
正如子查询别名所示,这里
, (SELECT @running_total := 0, @foo := NULL) variable_initialization_subquery
我们初始化变量。
我们ORDER BY foo
因为当您没有明确指定时,数据库中的数据有无可靠顺序。
然后SELECT
子句被认为是一列接一列。这里列的顺序也很重要。
首先我们这样做:
, @running_total := IF(@foo != foo, 0, @running_total + bar)
这计算每foo
的运行总计。当foo
更改时,运行总计将重置为0. IF()
功能的作用类似于IF(<boolean condition>, <then>, <else>)
。
这里变量@foo
仍然具有前一行的值。当前行的值在此行中分配:
, @foo := foo
我希望你能得到这个想法,随时可以询问是否有任何不清楚的地方。哦,你不需要select
部分中的那些case...when...
。
答案 1 :(得分:0)
猜猜......给这个人一条鱼 - 可能是错误的鱼
SELECT CONCAT("Trans ID ",TransactionID) ID
, DateTime
, Type Activity
, Amount
, 0 Payout
, CASE WHEN Activity = "deposit"
THEN Amount + playerdb.CurrentBalance
WHEN Activity IN("withdraw","bet")
THEN
CASE WHEN Payout >0
THEN Payout + playerdb.CurrentBalance
ELSE Amount - playerdb.CurrentBalance
END
END CurrentBalance
FROM transactiondb
LEFT
JOIN playerdb
ON transactiondb.PlayerID = playerdb.PlayerID
WHERE transactiondb.PlayerID = 10078
UNION ALL
SELECT CONCAT("Bet ID ",BetID)
, DateTime
, "Bet"
, BetAmount
, Payout
, CurrentBalance
FROM betdb
WHERE PlayerID = 10078
ORDER
BY DateTime;