나는 야구 관련 웹 사이트에서 일하고 있습니다. 나는 두 개의 야구 팀 타격 라인업이있는 테이블이 있습니다MySQL을 사용하는 선택 쿼리에서 CASE, WHEN, THEN, END를 사용합니다.
- 타격 주문 1-9 — 멀리 :
+----+----------+--------------+--------+ | id | playerId | battingOrder | active | +----+----------+--------------+--------+
타격 순서는 1, 이것은 다음과 같은 논리에 해당하는 20 사이의 정수입니다 팀 라인업
- 타격 주문 10 — 어웨이 팀 투수
- 타격 주문 11-19 — 홈 팀 라인업
- 타격 순서 20 — 홈 팀 투수
활성 필드는 마운드의 투수와 플레이트의 타자를 나타내는 작은 0 또는 1입니다.
알려진 사실 : 한 팀의 액티브 투수와 상대 팀의 액티브 투수가 항상 있습니다.
은 내가 battingOrder에서 다음 타자에 해당하는 홈 팀 플레이어에 대한 행을 반환하는 쿼리를 작성해야합니다.
예 (즉 후 활성 타자 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;
작동하는 것 같다,하지만 가장자리 경우 및/또는 함정 내가 걸어으로? 이것이 효율적입니까? 나는 특히 중첩 된 쿼리를 사용하지 않는 문제에 대한 솔루션에 관심이 있습니다.
이 잘 보이지 않는다. 왜 ID 열을보고 있니? battingOrder 열이어야합니다. – Stephen
@Stephen - 예. 그것은 오타입니다. 결정된. – Thomas
글쎄, 나는 귀하의 쿼리를 아무런 결과없이 그대로 사용했습니다. 나는 19 번 타격 순위의 플레이어를 액티브 상태로 두지 만, 두 쿼리 모두 결과를 반환하지 않습니다. – Stephen