0

Mysqlでクエリを実行して、ユーザーの全時間ランキングを取得しようとしています。今月のランキングについては、次のリクエストでなんとかやりました。

SELECT MAX(x.rank) AS rank
  FROM (SELECT 
               t.id_user,
               @rownum := @rownum + 1 AS rank
          FROM screengame_points t
          JOIN (SELECT @rownum := 0) r
          WHERE month = $month
      ORDER BY t.points DESC) x
 WHERE x.id_user = 4

いつも私はすべてのポイントの合計を計算する必要があるので、私は試しました:

SELECT MAX(x.rank) AS rank
  FROM (SELECT 
               t.id_user,
               @rownum := @rownum + 1 AS rank
          FROM screengame_points t
          JOIN (SELECT @rownum := 0) r
    GROUP BY id_user
      ORDER BY sum(t.points) DESC) x
 WHERE x.id_user = 4

(「groupbyid_user」と「sum(t.points)」に注意してください)。

しかし、それは機能していません。2回目のリクエストでのランキングの結果は、1か月でスコアが最も高いものから最も低いものまでだと思います。それは、すべての月のすべてのポイントの合計ではありません。

どうすればいいですか?

4

2 に答える 2

1

問題はORDER BY、どちらの場合も最適化されていることだと思います。最初のケースでは、単に幸運かもしれません。

MySQL のドキュメントにはORDER BY、サブクエリで許可されていると書かれています。ただし、に関して興味深い議論がここUNIONにあります。

ただし、個々の SELECT ステートメントに ORDER BY を使用しても、最終結果に表示される行の順序については意味がありません。デフォルトでは、UNION は順序付けされていない行セットを生成するためです。したがって、このコンテキストでの ORDER BY の使用は通常、LIMIT と組み合わせて使用​​されます。したがって、SELECT で取得する選択された行のサブセットを決定するために使用されます。 UNIONの最終結果。SELECT で LIMIT なしで ORDER BY が表示された場合、効果がないため、最適化されて除外されます。

これはUNION条項に関するものであることを強調します。単純なサブクエリに関しては何も見つかりません。ただし、ORDER BY最も外側のレベルを除いて、標準 SQL では使用できません。理由は簡単です。. . テーブルとサブクエリは順不同です。

LIMITサブクエリに句を含めることで、MySQL をだますことができる場合があります。すべてのユーザーを取得するのに十分な数を入力します (ただし、理論的には、これを最適化して取り除くことができます)。

この情報を取得するには、他に 2 つのオプションがあります。テーブルが大きすぎない場合は、自己結合を使用してランキング情報を取得できます。自動インクリメント列を使用して一時テーブルに挿入することもできます。そこでうまくいくと思いますorder by。(そして、他のほとんどすべてのデータベースが機能をサポートしているため、データベースの切り替えを割引していrankます。)

于 2012-11-10T17:30:38.507 に答える
0

解決策を見つけましたが、多くのレコードでクエリの実行が遅いと思います!

SELECT WrappedQuery.rank 
FROM (SELECT @rownum := @rownum +1 as rank, id_user
      FROM ( select @rownum := 0 ) sqlvars,
           (SELECT  t.id_user
            FROM screengame_points t
        GROUP BY id_user
            ORDER BY sum(t.points) DESC
        ) x 
     ) WrappedQuery
WHERE id_user = 4
于 2012-11-11T10:41:23.863 に答える