如何解决在MySQL的选择查询中,使用CASE,WHEN,THEN,END结束
|| 我正在与棒球相关的网站上工作。我有一张桌子,上面有两个棒球队的击球阵容:+----+----------+--------------+--------+
| id | playerId | battingOrder | active |
+----+----------+--------------+--------+
击球顺序是1到20之间的整数。它对应于以下逻辑:
击球顺序1-9-客队阵容
击球命令10 —客队投手
击球顺序11-19 —主队阵容
击球指令20-主队投手
活动字段是tinyint 0或1,表示土堆上的投手和板上的击球手。
已知事实:一队总是有一个活跃的投手,而另一队总是有一个活跃的击球手。
我需要编写一个查询,该查询返回与battingOrder中的下一个击球手相对应的主队队员的行。 (发生在活动击球手的击球顺序之后的那一次)
例:
如果battingOrder 13中的玩家处于活动状态,则查询应返回batting order 14中的玩家。
如果击球顺序为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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。