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 回答