在Django ORM或SQL中排名?

时间:2010-01-26 19:25:56

标签: 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


非常感谢帮助。谢谢:))

3 个答案:

答案 0 :(得分:9)

这些事情总是很难做到。每个人都需要多个查询。

因此,为了让球员在得分前后的位置之前和之后,首先你需要弄清楚那个位置是什么。 (请注意,这假设您不能拥有多个具有相同分数的人,这可能不一定是真的。)

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]

答案 1 :(得分:1)

获取用户的排名:

(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

答案 2 :(得分:0)

我使用ORM进行了3次查询,但我认为查询次数会更少:

{{1}}