Рейтинг в Django ORM или SQL?

Мне оценили огромный список различные значения (например, очки)

Таким образом, я захватываю список, заказанный этими значениями:

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

Я хотел бы:

  • Захватите плеер и получите соседние плееры

P1 score:123

P2 score:122

ВЫ! score:110

P3 score:90

P2 score:89

  • Захватите положение!

Вы - оцениваемый № 1234 для счета

Вы - оцениваемый № 9876 для кармы


Справка очень ценилась бы. спасибо :)

5
задан RadiantHex 26 January 2010 в 19:25
поделиться

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 является параметром, содержащим идентификатор текущего проигрывателя. Чтобы получить соседние игроки и текущий пользователь:

(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 не имеет функции RING () (MS SQL, Oracle, Postgres есть один). Я оглянулся, и я получил эту ссылку, объясняющую, как сделать рейтинг в MySQL: http://www.artfulsoftware.com/infotree/queries.php?&bw=1024#460 .

1
ответ дан 13 December 2019 в 22:07
поделиться

Эти виды вещей всегда очень трудно сделать. Вам понадобится несколько запросов для каждого.

Итак, чтобы получить игроков незадолго до и после своей позиции, когда заказано по-прежнему, сначала вам нужно будет работать, что такое позиция. (Обратите внимание, что это предполагает, что вы не можете иметь более одного человека с одинаковым баллом, который не обязательно может быть правдой.)

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]
9
ответ дан 13 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: