【问题标题】:Nested conditional statements on MysqlMysql 上的嵌套条件语句
【发布时间】:2014-09-16 12:21:38
【问题描述】:

我正在 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,所以我尝试使用别名

这可能吗?

【问题讨论】:

标签: mysql phpmyadmin


【解决方案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

我希望你能明白,如果有什么不清楚的地方,请随时询问。哦,你不需要case...when... 部分中的那些selects。

【讨论】:

    【解决方案2】:

    只是猜测......给男人一条鱼 - 可能是错误的鱼

     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;
    

    【讨论】:

    • 感谢您抽出宝贵时间阅读这篇文章。MySql 说“#1054 - '字段列表'中的未知列 'Activity'”
    • 在字段列表中?不,我认为我的字段列表还可以。也许你打错了?啊,但它可能指的是“WHEN 活动”。也许应该是“当类型”
    猜你喜欢
    • 2012-05-01
    • 2014-01-03
    • 2011-03-21
    • 2012-02-17
    • 2013-07-03
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多