Мне оценили огромный список различные значения (например, очки)
Таким образом, я захватываю список, заказанный этими значениями:
players = Player.objects.order_by('-score', '-karma')
Я хотел бы:
P1 score:123
P2 score:122
ВЫ! score:110
P3 score:90
P2 score:89
Вы - оцениваемый № 1234 для счета
Вы - оцениваемый № 9876 для кармы
Справка очень ценилась бы. спасибо :)
Чтобы получить рейтинг пользователя:
(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 .
Эти виды вещей всегда очень трудно сделать. Вам понадобится несколько запросов для каждого.
Итак, чтобы получить игроков незадолго до и после своей позиции, когда заказано по-прежнему, сначала вам нужно будет работать, что такое позиция. (Обратите внимание, что это предполагает, что вы не можете иметь более одного человека с одинаковым баллом, который не обязательно может быть правдой.)
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]