6

私はスコアカードシステムを含むゴルフアプリケーションに取り組んでいます。各プレーヤーの各スコアをデータベースに保存しているので、ティーの順序を決定するためのクエリを考え出す必要があります。たとえば、プレーヤーが3ホールをプレイし、スコアが次のようになっている場合...

Player    1  2  3
--------- -  -  -
Player 1: 3, 4, 3
Player 2: 2, 3, 3
Player 3: 2, 4, 3

...次に、注文は次のようになります...

1.) Player 2
2.) Player 3
3.) Player 1

...したがって、プレーヤーは、対戦相手のスコアと比較したスコアの順に並べられます。それは理にかなっていますか?これはクエリでも可能ですか、それともコード内の2D配列を解析する関数を作成する必要がありますか?その場合、私はJavaを使用しています。

私のテーブル構造は次のようになります。

  • プレーヤー(プレーヤーID、およびプレーヤー名)
  • ラウンド(ラウンドID、コースID)
  • スコア(ラウンドID、プレーヤーID、ホール番号、スコア)
4

3 に答える 3

3

Windows関数row_number()と、各レベルでの順序付けのためのデータベース内の追加の列(またはSQL Serverの再帰CTE)を使用するソリューションを見ることができます。ただし、SQLiteはこれをサポートしていません。

これは、多くの逆方向のクエリを実行せずにソリューションを実装するための私の推奨事項です。

(1)最初のティーにティーオーダーを割り当てる。

(2)次のティーごとに、前のスコアと前のティーの順序を確認します。

(3)最高スコアのDESCと前のティーオーダーASCで並べ替えて、前のスコアをループして、新しいティーオーダーを割り当てます。

ラウンドごとに数人のプレーヤーしかないため、アプリレイヤーでこれを行うのが妥当です。ただし、ウィンドウ関数をサポートするデータベースがある場合は、データベースのみのソリューションをより簡単に実行できます。

抵抗できません。ここに、注文を保存するためのテーブルでこれを行ういくつかのコードがあります。穴ごとに1回、ループする必要があります。

create table ThisOrder (
    ThisOrderId int primary key autoincrement,
    RoundId int,
    Hole int,
    PlayerId int
)

各プレイヤーで順番に初期化します。

次に、各穴のテーブルに新しい行を挿入します。

insert into ThisOrder(RoundId, HoleId, PlayerId)
    select s.RoundId, s.Hole+1, s.PlayerId
    from Scores s join
         ThisOrder to
         on s.PlayerId = to.PlayerId and
            s.RoundId = to.RoundId and
            s.Hole = to.Hole
    order by s.Score DESC, to.Order ASC

これは、ホールごとに1回、マイナス1回呼び出す必要があります。

次に、次のように注文します。

 select *
 from ThisOrder
 where roundid = <roundid> and hole = <thehole>
 order by ThisOrderId 
于 2012-05-15T17:58:11.897 に答える
0

このクエリは、プレーヤーのスコアが最も低く、それによって注文した最も高いホールを返します。

SELECT * FROM Players p
ORDER BY
  (SELECT MAX(s1.hole_number) FROM Scores s1
   LEFT JOIN Scores s2
     ON s2.round_id = s1.round_id AND
        s1.hole_number = s2.hole_number AND
        s2.score < s1.score
   WHERE s1.player_id = p.player_id AND
     s1.round_id = 1 AND s2.round_id IS NULL) DESC
于 2012-05-15T18:32:09.017 に答える
0

したがって、各プレーヤーの現在のホールの前にある各ホールのスコアを合計してから、合計されたスコアでプレーヤーIDのリストを並べ替える必要があります。

このようなものが機能するはずです:

SELECT SUM(score) AS score, player_id FROM Scores WHERE round_id=$current_round AND hole_number<$current_hole GROUP BY player_id ORDER BY score;

これにより、2つの列(player_idとscore)の結果テーブルが作成され、プレーヤーの数と同じ数の行が含まれ、スコアが最も高いプレーヤーが最初に配置されます。

于 2012-05-15T18:02:23.727 に答える