我正在开发一个与棒球相关的网站。我有一张桌子,上面有两支棒球队的击球阵容:
+----+----------+--------------+--------+
| id | playerId | battingOrder | active |
+----+----------+--------------+--------+
击球顺序是 1 到 20 之间的整数。这对应于以下逻辑:
- 击球顺序 1-9 - 客队阵容
- 击球顺序 10 - 客队投手
- 击球顺序 11-19 — 主队阵容
- 击球顺序 20 - 主队投手
活动字段是一个 tinyint 0 或 1,代表投手在土墩上和击球手在盘子上。
已知事实:总会有一名来自一支球队的现役投手和一名来自对方球队的现役击球手。
我需要编写一个查询,返回对应于 battingOrder中下一个击球手的主队球员的行。(在主动击球手的 battingOrder之后发生的那个)
例子:
- 如果 battingOrder 13 中的玩家处于活动状态,则查询应该返回 battingOrder 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;
它似乎有效,但我遇到了哪些边缘情况和/或陷阱?这有效率吗?我对不使用嵌套查询的问题的解决方案特别感兴趣。