Python 在Django ORM或SQL中排名?

Python 在Django ORM或SQL中排名?,python,sql,django,django-models,django-orm,Python,Sql,Django,Django Models,Django Orm,我有一个巨大的列表,按不同的值排序,例如分数 因此,我获取了按这些值排序的列表: 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没有排名函数MS SQL、Oracle、Postgres都有。我环顾四周,得到了这个链接,解释了如何在MySQL中进行排名:。

我使用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])

谢谢你,丹尼尔。这是一个非常有用的回答您不需要全部,只需应用过滤器-分数\uu lt对等分->等分排名效果更好-在最后一部分中,结果没有排序,因此位置没有帮助,您应该先排序-如果位置<2,将有例外,您应该将位置-2的最小值钳制为0。较高的部分是okRANK,似乎是SQL Server特定的扩展。它在大多数SQL方言中都不可用。谢谢您的回复!顺便说一句@Daniel在MySQL参考中找不到RANK,你会说MySQL方言支持这个吗?不仅仅是SQL Server;博士后8.4也包括排名。不知道MySQL;我想至少它有类似的东西。对不起,我不知道MySql没有。我知道SQL Server、Oracle和Postgres都有排名功能。我在四处寻找MySql的排名函数,我得到了这个链接:哇,谢谢你!这是一个有用的链接!你能把它加到你的答案里吗?