MySQL从排行榜获得排名

时间:2014-12-01 15:12:12

标签: mysql select leaderboard

我正在基于非常好的教程在游戏中实现排行榜。

http://gamedevelopment.tutsplus.com/tutorials/how-to-code-a-self-hosted-phpsql-leaderboard-for-your-game--gamedev-11627

我对MySQL很陌生,但我有一些基础知识。但是有一部分代码我完全无能为力,实际上是如何工作的,因为我不想实现对我没有任何意义的东西,我想问一下是否有人能帮我理解这个。它处理排行榜中返回玩家的排名:

SELECT  uo.*,
    (
    SELECT  COUNT(*)
    FROM    Scores ui
    WHERE   (ui.score, -ui.ts) >= (uo.score, -uo.ts)
    ) AS rank
FROM    Scores uo
WHERE   name = '$name';

我的理解是首先选择Scores表中的所有内容,然后选择行数,我不明白该选择是如何工作的,WHERE工作如何完全超出我的时间戳。然后我不确定它是如何一起工作的。

2 个答案:

答案 0 :(得分:1)

当数据库执行此查询时,首先从Scores中选择,按name = '$name'进行过滤。

然后,对于每一行,它执行子查询:

(
 SELECT  COUNT(*)
   FROM    Scores ui
  WHERE   (ui.score, -ui.ts) >= (uo.score, -uo.ts)
) AS rank

这意味着,对于具有搜索名称的Scores的每一行,它会搜索Scores(ui.score, -ui.ts)大于或等于当前行的值的记录数。< / p>

我希望能帮到你......

答案 1 :(得分:0)

来自代数的一个事实是-A&gt; = -B if-and-only-if A&lt; = B。

所以表达式(ui.score,-ui.ts)&gt; =(uo.score,-uo.ts)

只是检查ui.score&gt; = ui.score AND ui.ts&lt; = uo.ts的一种奇特方式。

包含时间戳的原因是,有一个&#34;平局断路器&#34;唯一地定义一个等级。

我不确定使用(A,-B)&gt; =(A2,-B2)是否提供任何性能优势而不仅仅是写(A> = A2)AND(B <= B2) 。