私は野球関連のウェブサイトに取り組んでいます。私は2つの野球チームのバッティングラインナップのテーブルを持っています:
+----+----------+--------------+--------+
| id | playerId | battingOrder | active |
+----+----------+--------------+--------+
打順は1から20までの整数です。これは次のロジックに対応します。
- 打率1-9—アウェイチームラインナップ
- バッティングオーダー10—アウェイチームピッチャー
- バッティングオーダー11-19—ホームチームラインナップ
- バッティングオーダー20—ホームチームピッチャー
アクティブフィールドは、マウンドのピッチャーとプレートのバッターを表すtinyint0または1です。
既知の事実:1つのチームから1人のアクティブなピッチャーと、反対側のチームから1人のアクティブなバッターが常に存在します。
battingOrderの次の打者に対応するホームチームプレーヤーの行を返すクエリを作成する必要があります。(アクティブなバッターのbattingOrderの後に発生するもの)
例:
- バッティングオーダー13のプレーヤーがアクティブな場合、クエリはバッティングオーダー14のプレーヤーを返す必要があります。
- バッティングオーダー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;
うまくいくようですが、どのようなエッジケースや落とし穴に踏み込んだことがありますか?これは効率的ですか?ネストされたクエリを使用しない問題の解決策に特に興味があります。