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的排名函数,我得到了这个链接:哇,谢谢你!这是一个有用的链接!你能把它加到你的答案里吗?