これを単純化しすぎているかどうかはわかりませんが、特定のユーザーが他のユーザーのランク内のどこにいるかを探している場合は、その人の「averageScore」が何であるかを調べてから、COUNT を取得します(*) 希望するレコードよりも平均が BETTER であるすべてのレコードを検索し、その人の名前を取得します... 次に、次のことを試してください。
改訂およびテスト済み -- SQL FIDDLE SQLFiddle
のサンプルには、ユーザー af および averageScores がそれぞれ 10 ~ 60 の 6 つのエントリがあります。クエリはユーザー 3 (avgScore) を選択するため、3 (d、e、f) の平均値が高く (40、50、60)、ユーザー 'c' (id 3) が 4 位になります。
SELECT
u.UserName,
PreQuery.AverageHigherThanYou +1 as UserRank
from
users u,
( select
COUNT(*) as AverageHigherThanYou
from
scoreListing s,
( select @MyAvg := s2.AverageScore
from scoreListing s2
where s2.UserID = 95890 ) sqlvars
where
s.AverageScore > @MyAvg ) PreQuery
where
u.userid = 95890
「プレクエリ」は、特定のユーザーのスコアリストに静的に結合されたものよりも少ないすべてのカウントを取得し、単一の列の値に入れます。
次に、カンマのユーザー テーブル (古い ANSI、結合基準なし) は常に 1 つのレコードを返します...次に、1 人のユーザーの名前情報を取得するために、USER テーブルにのみ WHERE 句を適用します。
ここで、平均がどれくらい高いか、同じか、または低いかを知りたい場合は、クエリを次のように調整できます
( SELECT
sum( if( s.averageScore < s2.averageScore, 1, 0 )) as LowerAverageThanYou,
sum( if( s.averageScore = s2.averageScore, 1, 0 )) as SameAverageAsYou,
sum( if( s.averageScore > s2.averageScore, 1, 0 )) as HigherAverageThanYou
from
scoreListing s
join scoreListing s2
ON s2.UserID = 95890 ) PreQuery,
再試行するには、マシンが解放されるまで待つ必要があります。
また、scoreListing テーブルには 2 つのインデックスがあります。その人の平均を比較するために UserID = 95890 レコードにジャンプする ID だけに 1 つと、averageScore にもう 1 つあるため、HIGHER THAN のみを実行した場合、WHERE 句はこれらのレコードのみをスキャンする必要があり、400,000 レコード全体ではありません。