在我的收入网站上,我的一些用户想知道他们今天的收入是什么“等级”。如果他们今天的收入排名第二,那么他们将排名第二。
我认为在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
答案 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;