ファンタジーサッカーゲームのユーザーのリーダーボードを作成する必要があります。ゲームの簡略化されたデータベースは次のとおりです。
users
squads
にsquad_players
があるmatches
ごとに(transfer_periodによって関連付けられます)players
各matches
にmatch_points
がありますsquad_players
にはposition、priorityがあります。 priorityは、squad_players
がmatches
にない場合の置換の順序です。squads
have formations
これは、各プレーヤーから選択するプレーヤーの最大数を決定しますposition ordered by priorityデータベースはMySQL 5.6であり、users
の最大数は10Kです。
squad_players
、squads
、matches
、match_points
を(順番に)内部結合して、プレイした各squad_players
のポイントを取得できます(players
プレイしなかった人にはmatch_points
がありません)。
[〜#〜] sum [〜#〜]ポイントxsquad_players
のポイントsquads
に苦労していますxはformations
にあり、squad_playersのpositionによって決定されます。
相関サブクエリを使用してGroup n with Top n-rowsのバージョンを変更しようとしましたが、成功しませんでした。
私のアプローチはここにあるべきですか?
私の期待される出力はこのようなものです
|---------|-----------|------------|----------|
| User ID | SQUAD ID | POSITION | POINTS |
|---------|-----------|------------|----------|
| 12 | 34 | defender | 12 |
|---------|-----------|------------|----------|
| 12 | 34 | forward | 2 |
|---------|-----------|------------|----------|
| 117 | 31 | midfielder | 5 |
|---------|-----------|------------|----------|
メモ:
出力を追加する必要がありますが、問題の説明を反映していない場合があります。
サンプルデータセットリンク を調べると、normalized_squad_player_points
という名前のビューが見つかります。これは、さまざまな統計を作成するために使用する非正規化テーブルです。
リーダーボードの最終出力は次のようになります
|---------------------|------------------|
| User ID | Points |
|---------------------|------------------|
| 12 | 34 |
|---------------------|------------------|
| 56 | 32 |
|---------------------|------------------|
| 117 | 31 |
|---------------------|------------------|
追加情報
squads
およびmatch_points
挿入へのペーストビンリンク 。最終的に実装したソリューションは、positions
とformations
の異なる順列に基づいてクエリをより単純なものに分割することでした。また、中間結果を保存するためにいくつかのテーブルを追加する必要がありました。すべてのクエリ(約42)をトランザクションで実行しました。
これはかなりうまくいき、サーバーのリソースを過負荷にすることなく、妥当な時間で完了しました。
1つの巨大なクエリでそれを行うことは、最初から悪い決定だったと思います。それをより小さなクエリに分割することで、プロセスを保守可能かつ柔軟にすることができました。