5

さまざまな値(スコアなど)でランク付けされた巨大なリストがあります

したがって、これらの値で並べ替えられたリストを取得します。

players = Player.objects.order_by('-score', '-karma')

私はしたいと思います:

  • プレーヤーをつかみ、隣接するプレーヤーを取得します

P1 スコア:123

P2 スコア:122

あなた!スコア: 110

P3 スコア:90

P2 スコア:89

  • 位置をつかめ!

あなたはスコアで 1234 位にランクされています

あなたはカルマで9876位にランクされています


助けていただければ幸いです。ありがとう :)

4

3 に答える 3

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]
于 2010-01-26T20:09:21.933 に答える
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

于 2010-01-26T20:48:30.133 に答える
0

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])
于 2015-06-22T14:13:23.877 に答える