繁体   English   中英

如何在SQL表中用分数存储用户等级

[英]How to store rank of a user in a level with his score in SQL table

我对SQL的所有知识都迷失了,我想知道如何实现一个根据玩家设置的等级和分数为玩家提供排名的字段。

我目前有什么

我想要的是

我对mySQL不太满意,所以这就是为什么我想知道应该怎么做。

计算值不是应该存储在表中的值。 类似的例子是年龄。 您不存储用户的年龄,而是存储其DOB。 在讨论数据库建模时,不断变化的值是一个复杂的问题。

这种类型的问题有一个名字。 它称为尺寸变化缓慢的wiki-link 因此,我建议您在应用程序中实现任何计算逻辑,而不是将其存储在数据库中。

但是,如果由于某种原因必须在数据库级别上使用它,则始终可以创建一个在一天的特定时段执行的过程。 然而,这可能会造成你的表中的数据可能不准确,直到该程序被执行时的情况介绍程序

对于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    |

尝试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM