数据库
首页 > 数据库> > 在使用MySQL的select查询中使用CASE,WHEN,THEN,END

在使用MySQL的select查询中使用CASE,WHEN,THEN,END

作者:互联网

我正在打一个棒球相关的网站.我有一个桌子,有两个棒球队的击球阵容:

+----+----------+--------------+--------+
| id | playerId | battingOrder | active |
+----+----------+--------------+--------+

击球顺序是1到20之间的整数.这对应于以下逻辑:

>击球命令1-9 – 客队阵容
>击球命令10 – 客队投手
>击球顺序11-19 – 主队阵容
>击球令20 – 主队投手

活动字段是一个tinyint 0或1,表示土墩上的投手和盘子上的击球手.

已知事实:一支球队总会有一名主动投手,另一支球队将有一名主动投手.

我需要编写一个查询,为主队球员返回一个对应于battingOrder中下一个击球手的行. (在活动击球手的击球后发生的那个)

例:

>如果battingOrder 13中的玩家处于活动状态,则查询应该按照击球顺序14返回玩家.
>如果battingOrder 19中的玩家处于活动状态,则查询应该以击球顺序11返回玩家(阵容循环回到团队的第一个玩家).

我之前从未使用过CASE查询,但我想出了以下内容:

SELECT *
  FROM lineups
 WHERE battingOrder = 
       CASE (
           SELECT battingOrder
             FROM lineups
            WHERE battingOrder > 10 AND active = 1
            LIMIT 1
       )
       WHEN 11 THEN 12
       WHEN 12 THEN 13
       WHEN 13 THEN 14
       WHEN 14 THEN 15
       WHEN 15 THEN 16
       WHEN 16 THEN 17
       WHEN 17 THEN 18
       WHEN 18 THEN 19
       WHEN 19 THEN 11
       END
 LIMIT 1;

它似乎有用,但我走进了什么边缘案例和/或陷阱?这有效吗?我特别感兴趣的是我的问题解决方案没有使用嵌套查询.

最佳答案:

Select LNext.player As NextPlayer
From lineups As L
    Left Join lineups As LNext
        On LNext.BattingOrder Between 11 And 20
            And LNext.BattingOrder  = Case
                                        When L.BattingOrder  = 19 Then 11
                                        Else L.BattingOrder  + 1
                                        End
Where L.battingOrder Between 11 And 20
    And L.active = 1

事实上,你可以让它像家一样处理,就像这样:

Select LNext.player As NextPlayer
From lineups As L
    Left Join lineups As LNext
        On LNext.BattingOrder  = Case
                                    When L.BattingOrder  = 19 Then 11
                                    When L.BattingOrder  = 9 Then 1
                                    Else L.BattingOrder  + 1
                                    End
Where L.active = 1

标签:mysql,select,subquery,case-when
来源: https://codeday.me/bug/20190515/1109250.html