現在、次の順序で並べ替える必要がある 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 つの異なるゲーム結果が同時に送信されるという問題が発生する可能性があります (ゲーム レポートが正しく表示されない可能性があります)。
とにかく、肝心なのは、ゲームの日付で並べ替え、挿入順序を保持する方法を見つけて、ゲームのチームのスコアの最後の並べ替え句を取得できるようにする必要があるということです (つまり、勝利チームで並べ替えます)。
アイデアを歓迎します
ありがとう