2

私は、すべてのプレーヤーがプレイしたすべての試合の記録で構成されるテーブルを持っています。私はこの質問のトップアンサーからかなり良いスタートを切りました:何百万ものエントリでランキングし、現在このクエリを使用して各プレーヤーの最高スコアとそのランクを取得しています:

SET @rank=0;

SELECT user_id, score, rank FROM (
    SELECT *, @rank := @rank + 1 as rank
    FROM high_scores
    JOIN (
        SELECT user_id as user_id2, MAX(score) AS max_score         
        FROM high_scores
        GROUP BY user_id2
        ORDER BY max_score DESC) AS max_score_table                
    ON max_score = high_scores.score AND high_scores.user_id = user_id2) derived_table
ORDER BY rank;

繰り返しになりますが、これにより、各プレーヤーのトップスコアとそのランクの適切な順序付きリストが得られます。user_idただし、特定の情報を提供し、結果をこのユーザーのスコアと、周囲のより高いスコアとより低いスコアのX量までフィルタリングできるようにしたいと思います。

SELECT ... WHEREに対して「derivated_table」を実行しuser id、返された行を使用し'rank'て最上位のステートメントをフィルタリングする必要があると思いますSELECTが、クエリが受け入れられない(「derivated_tableが存在しません」)ことに加えて、私が行っていた方法では、derived_tableを2回再クエリする必要があり(大なりテストと小なりテストの場合)、クエリの効率がおそらく必要以上に低くなりました。

ハイスコ​​アの完全なリストをフィルタリングして、単一user_idのエントリと周囲のエントリのXの量にランク付けするにはどうすればよいですか?私が思いついたコード(または私が現在持っているコード)についての洞察をいただければ幸いです。

4

1 に答える 1

0
SELECT ranks.rank, ranks.user_id, ranks.maxscore FROM (

  -- find the rank of each user by counting the number of
  -- users who have a score greater than that user's highest
  SELECT   currentuser.user_id,
           currentuser.maxscore,
           IFNULL(COUNT(DISTINCT high_scores.user_id),0) rank
  FROM     high_scores JOIN (
    -- current user's highest score
    SELECT user_id, MAX(score) maxscore FROM high_scores GROUP BY user_id
  ) currentuser ON high_scores.score > currentuser.maxscore
  GROUP BY currentuser.user_id

) ranks JOIN (

  -- find the rank of the user we want similarly
  SELECT IFNULL(COUNT(DISTINCT user_id),0) rank
  FROM   high_scores JOIN (
    -- our user's highest score
    SELECT MAX(score) maxscore FROM high_scores WHERE user_id = ?
  ) userscore ON high_scores.score > userscore.maxscore

-- filter for only those who are within given range from our user's rank
) userrank ON ranks.rank BETWEEN userrank.rank - ? AND userrank.rank + ?

-- sort the results
ORDER BY ranks.rank
于 2012-10-21T10:43:27.433 に答える