[英]Using CASE, WHEN, THEN, END in a select query with MySQL
我正在打一個棒球相關的網站。 我有一個桌子,有兩個棒球隊的擊球陣容:
+----+----------+--------------+--------+
| id | playerId | battingOrder | active |
+----+----------+--------------+--------+
擊球順序是1到20之間的整數。這對應於以下邏輯:
活動字段是一個tinyint 0或1,表示土墩上的投手和盤子上的擊球手。
已知事實 :一支球隊總會有一名主動投手,另一支球隊將有一名主動投手。
我需要編寫一個查詢,為主隊球員返回一個對應於battingOrder中下一個擊球手的行。 (在活動擊球手的擊球后發生的那個)
例:
我之前從未使用過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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.