Rad*_*Hex 5 python sql django django-models django-orm
我有一个巨大的列表按各种值(例如分数)排名
所以我抓住这些值排序的列表:
players = Player.objects.order_by('-score', '-karma')
Run Code Online (Sandbox Code Playgroud)
我想要:
P1得分:123
P2得分:122
你!得分:110
P3得分:90
P2得分:89
您的分数排名#1234
您的业力排名#9876
非常感谢帮助.谢谢 :)
这些事情总是很难做到.每个人都需要多个查询.
因此,为了让球员在得分前后的位置之前和之后,首先你需要弄清楚那个位置是什么.(请注意,这假设您不能拥有多个具有相同分数的人,这可能不一定是真的.)
me = Player.objects.get(pk=my_pk)
position = Players.objects.all().filter(
score__lte=me.score).order_by('-score').count()
players = Players.objects.all()[position-2:position+2]
Run Code Online (Sandbox Code Playgroud)
获取用户的排名:
(SELECT * FROM (
SELECT
RANK() OVER (ORDER BY Score desc ,Karma desc) AS ranking,
Id,
Username,
Score, karma
FROM Players
) AS players_ranked_by_score
where Id = id_of_user
Run Code Online (Sandbox Code Playgroud)
其中id_of_user是包含当前玩家id的参数。获取邻近玩家和当前用户:
(SELECT * FROM (
SELECT
RANK() OVER (ORDER BY Score desc ,Karma desc) AS ranking,
Id,
Username,
Score, karma
FROM Players
) AS all_players_ranked
where ranking >= player_ranking - 2 and ranking <= player_ranking + 2;
Run Code Online (Sandbox Code Playgroud)
其中player_ranking是从上面的查询中获得的排名。
希望能帮助到你!
更新:MySQL 没有rank() 函数(MS SQL、Oracle、Postgres 有)。我环顾四周,得到了这个链接,解释了如何在 MySQL 中进行排名:http://www.artfulsoftware.com/infotree/queries.php ?&bw=1024#460 。