1

私はSQLデータベースの統計に基づいたウェブサイトのリーダーボード風ランキングシステムに取り組んでいます。ただし、ユーザーがユーザー名を入力できるようにしたいので、5ランク少なく、5ランク多く表示されます。

情報を取得したいテーブルの長さは約123,000行であり、ご想像のとおり、これを実行するには非常に長い時間がかかるため、これを行う方法がわかりません。行を検索し、x行に達するまで行数をログに記録してから行番号を分割する簡単な方法があるかどうか疑問に思いました。また、気になる場合は、そのクエリで上位および下位の行を取得する方法に関する情報を含めてください。ありがとう :)

他の情報については、これはsqlとphpで行われることを望んでいます

これで何をしたいのかをよりよく示すために、特定の基準(この場合は名前)を満たす特定の行の結果番号を見つけ、その番号を使用してその周辺のデータを取得します。そして、すべての結果をスキャンしなくても、#結果を取得できるようにしたいと思います。

4

1 に答える 1

1

score列にインデックスがあっても、ランキングを作成するために完全なテーブルスキャンが必要になるため、あまり効率的ではありませんが、これはあなたが望むことを行います:

SELECT    allusers.rank, allusers.Name, allusers.Kills
FROM (
  SELECT   AgStats.Name,
           @t:=IF(score<=>@s,@t,@r) AS rank,
           @s:=AgStats.Kills AS Kills,
           @r:=@r+1
  FROM     AgStats, (SELECT @r:=0, @s:=NULL, @t:=NULL) init
  ORDER BY AgStats.Kills DESC
) allusers, (
  SELECT COUNT(*) AS rank
  FROM   AgStats
  WHERE  Kills > (SELECT Kills FROM AgStats WHERE Name = 'VoidWhisperer')
) user
WHERE    ABS(allusers.rank-user.rank) <= 5
ORDER BY allusers.rank
于 2012-12-03T22:51:49.173 に答える