Как сохранить рейтинг пользователя на уровне его оценки в таблице SQL - PullRequest
0 голосов
/ 20 апреля 2019

Я довольно растерян во всем, что касается SQL, и я хотел бы знать, как реализовать поле, которое дает игроку ранг в зависимости от уровня и установленного им балла.

What I currently have

What I want

Я не очень хорош с MySQL, поэтому я хотел бы знать, как мне это сделать.

Ответы [ 3 ]

1 голос
/ 20 апреля 2019

Для MySql 8.0 вы можете использовать rank():

select 
  t.*, 
  rank() over (partition by t.level order by t.score DESC) `rank`
from tablename t
order by level, user

См. Демоверсию .
Для более ранних версий:

select 
  t.*,
(select count(*) from tablename where level = t.level and score > t.score) + 1 `rank`  
from tablename t 

См. Демоверсию .
Результаты:

| level | user | score | rank |
| ----- | ---- | ----- | ---- |
| 1     | A    | 10    | 3    |
| 1     | B    | 15    | 2    |
| 1     | C    | 30    | 1    |
| 2     | A    | 20    | 2    |
| 2     | B    | 10    | 3    |
| 2     | C    | 40    | 1    |
1 голос
/ 20 апреля 2019

Расчетные значения не должны храниться в таблицах. Подобный пример - возраст. Вы не храните возраст пользователя, но его DOB. Значения, которые постоянно меняются, являются сложным вопросом при обсуждении моделирования базы данных.

Существует название для этого типа проблемы. Это называется медленно меняющиеся размеры вики-ссылка . Поэтому я бы посоветовал вам реализовать любую логику расчета в вашем приложении, а не хранить ее в базе данных.

Но, если по какой-то причине он должен быть на уровне вашей БД, вы всегда можете создать процедуру, которая будет выполняться в определенные периоды дня. Однако это может создать ситуации, когда ваши данные в таблицах могут быть неточными до тех пор, пока процедура не будет выполнена Введение в процедуры .

0 голосов
/ 20 апреля 2019

попробуйте это:

select level,user,score,
rank() over(partition by level order by score desc) as rank
from Tablename;
...