我需要一个游戏中排名最高的玩家列表。等级是在运行中计算的,数据来自两个表。我设法以正确方式订购,但@rank:= 0 - > @rank:= @ rank + 1 trick,其中名为rank的附加字段正在计算与特定排序参数对应的玩家的位置,不返回正确的排名顺序。这就是我所拥有的:
SET @rank := 0;
SELECT
@overall := u_p_s.exploration + u_p_s.story + u_p_s.collection + u_p.experience AS overall,
@rank := @rank + 1 AS rank,
u.nick, u.user_id, u_p_s.exploration, u_p_s.story, u_p_s.collection, u_p.experience
FROM user AS u
INNER JOIN user_profile_stats AS u_p_s ON u_p_s.user_id = u.user_id
INNER JOIN user_profile AS u_p ON u_p.user_id = u.user_id
ORDER BY overall DESC
LIMIT 0 ,20;
结果是正确的整体订单,但排名顺序错误。我总是可以计算行数并在应用程序层中获得排名,但我仍然需要知道我的查询有什么问题。如果您对如何计算特定用户的排名有任何建议,我愿意接受建议。我已经看到了很多类似的问题,但是他们都没有动态计算排名参数(整体),因为我不是MySql中最好的,所以我很乐意寻求你的帮助。谢谢。
解决方案:
SET @rank:=0;
SELECT
@rank := @rank +1 AS rank,
nick, user_id, story, overall, collection, experience, exploration
FROM (
SELECT @overall := u_p_s.exploration + u_p_s.story + u_p_s.collection + u_p.experience AS overall,
u.nick, u.user_id, u_p_s.story, u_p.experience, u_p_s.collection, u_p_s.exploration
FROM user AS u
INNER JOIN user_profile_stats AS u_p_s ON u_p_s.user_id = u.user_id
INNER JOIN user_profile AS u_p ON u_p.user_id = u.user_id
ORDER BY overall DESC
LIMIT 0 , 20
) AS result
答案 0 :(得分:2)
我认为问题在于您在排序之前先计算排名。
如果你像这样尝试smth怎么办:
SELECT
@rank := @rank + 1 AS rank,
overall, u.nick, u.user_id, ...
FROM (SELECT ... <your query including ORDER BY>)