基于订单选择Mysql计数行“以上”

时间:2013-04-26 04:17:53

标签: mysql sql

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

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

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

编辑:他们还想知道他们需要多少才能提高排名。

Edit2:上述系统的另一个问题是每个收入为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

2 个答案:

答案 0 :(得分: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上的索引对这两个查询都有很长的路要走。用户名的单独索引将有助于第一个。

答案 1 :(得分:0)

这是对修改3

的回复

我不确定它是否能解决您的问题,但在mySql中,使用自动增量ID创建伪列非常容易。

SET @ID=0;
SELECT @ID=@ID+1, s.* 
FROM Status s
WHERE ...
ORDER BY earnings;