5

私は野球関連のウェブサイトに取り組んでいます。私は2つの野球チームのバッティングラインナップのテーブルを持っています:

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

打順は1から20までの整数です。これは次のロジックに対応します。

  1. 打率1-9—アウェイチームラインナップ
  2. バッティングオーダー10—アウェイチームピッチャー
  3. バッティングオーダー11-19—ホームチームラインナップ
  4. バッティングオーダー20—ホームチームピッチャー

アクティブフィールドは、マウンドのピッチャーとプレートのバッターを表すtinyint0または1です。

既知の事実:1つのチームから1人のアクティブなピッチャーと、反対側のチームから1人のアクティブなバッターが常に存在します。

battingOrderの次の打者に対応するホームチームプレーヤーの行を返すクエリを作成する必要があります。(アクティブなバッターのbattingOrderの後に発生するもの)

例:

  1. バッティングオーダー13のプレーヤーがアクティブな場合、クエリはバッティングオーダー14のプレーヤーを返す必要があります。
  2. バッティングオーダー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;

うまくいくようですが、どのようなエッジケースや落とし穴に踏み込んだことがありますか?これは効率的ですか?ネストされたクエリを使用しない問題の解決策に特に興味があります。

4

1 に答える 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
于 2011-04-13T22:38:21.667 に答える