2013-04-26 67 views
0

在我的收入网站上,我的一些用户想知道他们对今天的收入有何“排名”。如果他们今天的收入排在第二位,他们将排在第二位。根据订单选择的“以上”Mysql计数行

我能想到在Mysql中做到这一点的唯一方法是Select user FROM stats WHERE date=today ORDER BY earnings,然后遍历结果直到找到所需的用户。

这似乎是一个很简单的操作很多工作。有一个更好的方法吗?

编辑:他们也想知道他们需要赚多少钱才能晋升排名。

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

编辑3:也许如果我可以根据收入的ORDER分配一个自动增量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 
+0

您可以使用'coalesce(min(others.earnings) - min(my.earnings),0)作为rankdiff而不是子查询(合并将第一个等级的null更改为0),并且如果您希望所有关系都相同排名使用'count(distinct others.earnings)+ 1'而不是你的数量。 – piotrm 2013-04-26 05:02:17

回答

2

如果你想找到一个用户的级别,有关系,那么你可以使用此查询

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上的索引都会有很长的路要走。关于用户名的单独索引将有助于第一个。

+0

谢谢!现在正在处理这个问题...无论如何都要在同一个查询中找到两个问题 – hellohellosharp 2013-04-26 04:35:23

+0

运行两个查询的代价很小,所以即使答案是肯定的,我也不会使其复杂化。 – RichardTheKiwi 2013-04-26 04:43:17

0

这是您的编辑响应3

我不知道是否它可以解决您的问题,但在mySql中,创建伪自动增量列的操作非常简单。

​​
+0

太棒了!我可以轻松获得用户的排名!那么在你之上引用用户权利呢?我无法使用WHERE等级= – hellohellosharp 2013-04-26 04:31:45