私は次のテーブルを持っています:
ユーザー基本データ(一意)
[userid] [name] [etc]
ユーザーコレクション(1対1)
[userid] [game]
ユーザーが記録したプレイ(多対多)
[userid] [game] [scenario] [etc]
ゲーム基本データ(ユニーク)
[game] [total_scenarios]
上位10人のユーザーのコレクション再生完了率を%の降順で示す表を出力したいと思います。
出力テーブル
[userid] [collection_completion]
3 95%
1 81%
24 68%
etc etc
私の考えでは、ONEUSERの計算シーケンスは次のとおりです。
User Collection
との結合からユーザーの所有シナリオの合計を取得しGame Basic Data
、COUNT(gbd.total_scenarios)
COUNT(DISTINCT scenario)
そのユーザーのために記録されたすべての演劇をつかむ- 記録されたすべての演劇を所有シナリオの合計で割ります
これが2つのクエリと最後のちょっとしたPHPマッサージです。完了率でソートされたユーザーのリストの場合、物事はもう少し複雑になります。
1つのクエリですべてのユーザーのコレクションの合計を取得し、別のクエリですべてのユーザーが再生を記録してから、計算を実行してPHPで最終的な配列を並べ替えることができると思いますが、1000人以上のユーザーに対してこれらすべてを実行するのはやり過ぎのようです。トップ10だけが欲しいとき。
MySQLに、それをすべて実行できる邪悪なモンスタークエリはありますLIMIT 10
か?それとも、この場合、作業の大部分を処理するPHPに固執する方法ですか?