0

在我的收益网站上,我的一些用户想知道他们今天的收益是什么“排名”。如果他们今天的收入排名第二,那么他们将排名第二。

我能想到的唯一方法是在 Mysql 中执行此操作Select user FROM stats WHERE date=today ORDER BY earnings,然后循环遍历结果,直到找到所需的用户。

对于一个有点简单的操作来说,这似乎需要做很多工作。有一个更好的方法吗?

编辑:他们还想知道他们还需要赚多少才能提升等级。

编辑2:上述系统的另一个问题是每个收入为 0 美元的人的排名不同,而理想情况下,我希望他们与同一排名并列。

Edit3:也许如果我可以根据收入的顺序分配自动递增 ID 的某种视图,那么您的 ID 也将是您的排名。我还可以轻松地引用 ID-1 用户上方的人。这可能吗?

Edit4:感谢richardthekiwi,我为任何感兴趣的人提出了真正的查询:

SELECT  
count(*)+1 MyRanking,
IFNULL((SELECT earnings from today_stats rankUp WHERE rankUp.earnings > my.earnings ORDER BY rankUp.earnings LIMIT 1)-my.earnings,0) AS rankdiff,
my.earnings
FROM today_stats my
left join today_stats others on others.earnings > my.earnings
WHERE my.user_id=18132
4

2 回答 2

2

如果您想查找 SINGLE 用户的排名,有关系,那么您可以使用此查询

   select count(*)+1 MyRanking
     from stats my
left join stats others on others.earnings > my.earnings
    where username = 'abcdef';

要找出他们需要多少升职,只需寻找下一个更高的收入,例如

   select IFNULL(others.earnings - my.earnings, 0) DifferenceToNext
     from stats my
left join stats others on others.earnings > my.earnings
    where username = 'abcdef'
 order by others.earnings asc
    limit 1;

对于这两个查询,索引stats.earnings将大有帮助。一个单独的用户名索引将有助于第一个。

于 2013-04-26T04:28:20.950 回答
0

这是对您的编辑 3的回应:

我不确定它是否能解决你的问题,但mySql很容易用 auto-incremental 创建一个伪列ID

SET @ID=0;
SELECT @ID=@ID+1, s.* 
FROM Status s
WHERE ...
ORDER BY earnings;
于 2013-04-26T04:27:10.557 回答