1

私は次のテーブルを持っています:

ユーザー基本データ(一意)
[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の計算シーケンスは次のとおりです。

  1. User Collectionとの結合からユーザーの所有シナリオの合計を取得しGame Basic DataCOUNT(gbd.total_scenarios)
  2. COUNT(DISTINCT scenario)そのユーザーのために記録されたすべての演劇をつかむ
  3. 記録されたすべての演劇を所有シナリオの合計で割ります

これが2つのクエリと最後のちょっとしたPHPマッサージです。完了率でソートされたユーザーのリストの場合、物事はもう少し複雑になります。

1つのクエリですべてのユーザーのコレクションの合計を取得し、別のクエリですべてのユーザーが再生を記録してから、計算を実行してPHPで最終的な配列を並べ替えることができると思いますが、1000人以上のユーザーに対してこれらすべてを実行するのはやり過ぎのようです。トップ10だけが欲しいとき。

MySQLに、それをすべて実行できる邪悪なモンスタークエリはありますLIMIT 10か?それとも、この場合、作業の大部分を処理するPHPに固執する方法ですか?

4

1 に答える 1

2

私があなたが正しく必要としているものを理解しているなら、あなたは次のようなことを試すことができます

SELECT  userid,
        us.TotalUserscenario / gbd.total_scenarios collection_completion
FROM    (
            SELECT  userid,
                    game,
                    COUNT(scenario) TotalUserscenario
            FROM    UserRecordedPlays urp
            GROUP BY    userid,
                        game
        ) UserScenarios us INNER JOIN
        GameBasicData gbd ON us.game = gbd.game
ORDER BY collection_completion DESC
LIMIT 10
于 2010-04-12T03:19:00.207 に答える