2011-04-13 78 views
5

我正在研究棒球相關網站。我有一個擊球陣容的表兩個棒球隊:在使用MySQL的選擇查詢中使用CASE,WHEN,THEN,END

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

擊球順序爲1和20。這對應於下面的邏輯之間的整數:

  1. 擊球順序1-9 —客場球隊陣容
  2. 擊球順序10 —客場球隊投手
  3. 擊球順序11-19 —首頁球隊陣容
  4. 擊球順序20 —主隊投手

活動區域是一個tinyint 0或1,代表土丘上的投手和盤子上的擊球手。

已知的事實:總是會有一個球隊的主動投手和對方球隊的一個主動投手。

我需要寫一個返回一行對應於battingOrder的下一個連擊主隊球員的查詢。

實施例(即該之後發生活性麪糊的battingOrder的一個):

  1. 如果battingOrder 13球員是活動的,該查詢應在擊球順序返回播放器14
  2. 如果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; 

看來工作,但什麼邊緣情況和/或陷阱我已走進了?這是否有效?我特別感興趣的是我的問題不使用嵌套查詢的解決方案。

回答

7
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 
+0

這看起來不正確。你爲什麼在看id列?它應該是battingOrder列。 – Stephen 2011-04-13 22:50:30

+0

@Stephen - 是的。這是一個錯字。固定。 – Thomas 2011-04-13 22:55:28

+0

好吧,我用你的查詢逐字逐句,沒有結果。我有一名玩家在擊球順序排名第19位處於激活狀態,但是您的查詢都沒有返回任何結果。 – Stephen 2011-04-13 22:57:56