Mysql上的嵌套条件语句

时间:2014-09-15 05:54:53

标签: mysql phpmyadmin

我正在开发一个关于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,所以我尝试使用别名

这可能吗?

2 个答案:

答案 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;