2011-04-13 5 views
5

나는 야구 관련 웹 사이트에서 일하고 있습니다. 나는 두 개의 야구 팀 타격 라인업이있는 테이블이 있습니다MySQL을 사용하는 선택 쿼리에서 CASE, WHEN, THEN, END를 사용합니다.

  1. 타격 주문 1-9 — 멀리 :

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

    타격 순서는 1, 이것은 다음과 같은 논리에 해당하는 20 사이의 정수입니다 팀 라인업

  2. 타격 주문 10 — 어웨이 팀 투수
  3. 타격 주문 11-19 — 홈 팀 라인업
  4. 타격 순서 20 — 홈 팀 투수

활성 필드는 마운드의 투수와 플레이트의 타자를 나타내는 작은 0 또는 1입니다.

알려진 사실 : 한 팀의 액티브 투수와 상대 팀의 액티브 투수가 항상 있습니다.

은 내가 battingOrder에서 다음 타자에 해당하는 홈 팀 플레이어에 대한 행을 반환하는 쿼리를 작성해야합니다.

예 (즉 후 활성 타자 battingOrder을 발생 하나) battingOrder 13 플레이어가 활성화되면, 쿼리 타순에 플레이어를 반환해야

  1. 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

+0

@Stephen - 예. 그것은 오타입니다. 결정된. – Thomas

+0

글쎄, 나는 귀하의 쿼리를 아무런 결과없이 그대로 사용했습니다. 나는 19 번 타격 순위의 플레이어를 액티브 상태로 두지 만, 두 쿼리 모두 결과를 반환하지 않습니다. – Stephen

관련 문제