私は、すべてのプレーヤーがプレイしたすべての試合の記録で構成されるテーブルを持っています。私はこの質問のトップアンサーからかなり良いスタートを切りました:何百万ものエントリでランキングし、現在このクエリを使用して各プレーヤーの最高スコアとそのランクを取得しています:
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の量にランク付けするにはどうすればよいですか?私が思いついたコード(または私が現在持っているコード)についての洞察をいただければ幸いです。