我有一个按各种值(例如分数)排列的庞大列表
所以我抓取了按这些值排序的列表:
players = Player.objects.order_by('-score', '-karma')
我想:
- 抓住一个玩家并获得相邻的玩家
P1分数:123
P2分数:122
你!得分:110
P3分数:90
P2分数:89
- 抢位置!
你的得分排名#1234
你的业力排名#9876
帮助将不胜感激。谢谢 :)
我有一个按各种值(例如分数)排列的庞大列表
所以我抓取了按这些值排序的列表:
players = Player.objects.order_by('-score', '-karma')
我想:
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]
获取用户排名:
(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
其中 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;
其中 player_ranking 是从上面的查询中获得的排名。
希望能帮助到你!
更新:MySQL 没有 rank() 函数(MS SQL、Oracle、Postgres 都有)。我环顾四周,得到了解释如何在 MySQL 中进行排名的链接:http ://www.artfulsoftware.com/infotree/queries.php?&bw=1024#460 。
我使用 ORM 进行了 3 个查询,但我认为更少的查询会更好:
user_rank = Score.objects.filter(high_score__gt=user_score.high_score).count() + 1
neighbour_scores = Score.objects.filter(game_id=gme,~Q(user_id = usr),high_score__gte=user_score.high_score).order_by('high_score')[:offset]
neighbour_scores.append(user_score)
neighbour_scores.append(Score.objects.filter(game_id=gme, high_score__lt=user_score.high_score).order_by('-high_score')[:offset])