我正在基于非常好的教程在游戏中实现排行榜。
我对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工作如何完全超出我的时间戳。然后我不确定它是如何一起工作的。
答案 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) 。