Я работаю над сайтом, связанным с бейсболом. У меня есть стол с составом ватина для двух бейсбольных команд:
+----+----------+--------------+--------+
| id | playerId | battingOrder | active |
+----+----------+--------------+--------+
Порядок ватин представляет собой целое число от 1 до 20. Это соответствует следующей логике:
- Порядок ватин 1-9 & mdash; Состав команды гостей
- Ватин порядка 10 & mdash; Кувшин в гостях
- Порядок ватин 11-19 & mdash; Состав домашней команды
- Ватин порядка 20 & mdash; Кувшин домашней команды
Активным полем является tinyint 0 или 1, представляющее кувшин на насыпи и жидкое тесто на тарелке.
Известный факт : Всегда будет один активный кувшин от одной команды и один активный кувшин от противоположной команды.
Мне нужно написать запрос, который возвращает строку для игрока домашней команды, которая соответствует следующему бэттеру в 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;
Кажется, это работает, но в какие крайние случаи и / или ловушки я попал? Это эффективно? Меня особенно интересует решение моей проблемы, которое не использует вложенный запрос.