-1

現在、次の順序で並べ替える必要がある 3 つの値があります。

明らかに、2 番目の並べ替えパラメーターを一意のキーとして使用すると、3 番目の並べ替えパラメーターは無視されます。そのため、たとえばゲーム結果の PK ID で並べ替えるのではなく、実稼働アプリで、一意ではない増分値を格納する「並べ替え」列を作成しました (以下のクエリ結果を参照)。

SORT BY gameDate, sort, total DESC

合計で並べ替えると、最初に勝った (または引き分けた) チームが得られるため、そうする必要はありません。

if(teamA.total >= teamB.total) // show winner on left, loser on right

アプリケーション層で、毎週のゲーム レポートを生成します。

したがって、ソートケーキを作成し、中間のソート列を維持しないようにするには、日時またはタイムスタンプでうまくいくようです。ただし、キャッチは、挿入日で非一意に並べ替える必要があることです (日付の値は、両方の参加チームの結果行で同じでなければなりません)。それ以外の場合は、ゲーム結果の PK ID で並べ替えるのと同じです。3 番目の並べ替え列は次のようになります。無視されます。

なぜこれを行う必要があるのですか?要件は、最新のゲーム結果が特定のゲーム日付 (gameDate で並べ替え、PK ID で並べ替え) で最後に表示される必要があることです。 2 番目のソート パラメータとしての一意のキー列)。

おそらく今でもこれは泥のように明らかです;-)

オリジナル
レポートに表示する必要のあるゲーム結果のリストがあり、ゲームの日付で並べ替えられ、その後に固定の並べ替え順序が続きます (つまり、レポートの日付ごとに最後に表示する必要があるのは、最近表示されたゲームが最後に表示されるため、ゲーム ID で並べ替えることはできません)。 ) そして最後に、チームのスコアを獲得します。

アプリの現在のバージョンでは、int ソート列を使用しています。これは、ゲーム結果の送信時に照会され、db 挿入操作のために 1 ずつインクリメントされます。最終結果は、次のようなクエリを実行できることです。

SELECT id, gameID, gameDate, teamID, total, sort 
FROM games 
ORDER BY gameDate, sort, total desc

+----+--------+------------+--------+-------+------+
| id | gameID | gameDate   | teamID | total | sort |
+----+--------+------------+--------+-------+------+
|  1 |      3 | 2011-12-01 |    798 |     6 |  161 |
|  2 |      3 | 2011-12-01 |    106 |     3 |  161 |
|  3 |      4 | 2011-12-01 |     78 |     8 |  162 |
|  4 |      4 | 2011-12-01 |    106 |     7 |  162 |
|  5 |      5 | 2011-12-04 |    106 |     4 |  163 |
|  6 |      5 | 2011-12-04 |    167 |     3 |  163 |
+----+--------+------------+--------+-------+------+

ただし、並べ替え列を維持することは避けたいと思います。はい、クエリで gameDate で並べ替え、次にゲーム結果 ID PK で並べ替え、アプリケーション層で勝者チームの並べ替えを決定して、 を実行できますif(teamA.total >= teamB.total) ....が、それも醜いです ;-)

おそらく、DateTime、または Timestamp (一意でないことが許可されている場合) でうまくいくかもしれないと考えています。MySQL はマイクロ秒を処理しないため、2 つの異なるゲーム結果が同時に送信されるという問題が発生する可能性があります (ゲーム レポートが正しく表示されない可能性があります)。

とにかく、肝心なのは、ゲームの日付で並べ替え、挿入順序保持する方法を見つけて、ゲームのチームのスコアの最後の並べ替え句を取得できるようにする必要があるということです (つまり、勝利チームで並べ替えます)。

アイデアを歓迎します

ありがとう

4

2 に答える 2

0

挿入を DateTime として保存することは、より簡単で保守しやすいアプローチのようです (現在配置されているハッキングされた並べ替え列に対して)。sort 句は次のようになります。

SORT BY gameDate, createDate, gameID, total DESC

createDate が一意でない場合、後続の並べ替え列に到達できることを意味します。このシナリオでは、2 つの個別のゲーム結果が同時に送信されたとしても、gameID ソートが目的の最終ソートである優勝チームへのゲートウェイを提供するため、問題にはなりません ;-)

したがって、基本的にはアプリケーション層で行うことができます:

games.map(x=> dao.insert(x))

ここで、ゲーム結果の各参加者チームは、createDate 列の DateTime 値が同じです。

トリックを行う必要があります...

于 2012-10-20T16:06:25.713 に答える
0

私のコメントからのさらなる議論:

1) 各ゲームに 2 チームしかないことがわかっている場合、この方法で正規化する必要はありません。次のようなもの: gameID、team1ID、team1Total、team2ID、team2Total、tsPosted の方がよいでしょう。

まあ、今のところ1)で十分です。アプリケーション層でロジックを必要とせずに、それ自体でテーブルに参加して勝者を見つけることができることに言及するつもりでした。

于 2012-10-20T11:41:31.573 に答える