如何将用户的等级存储在他在SQL表中的分数的级别中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将用户的等级存储在他在SQL表中的分数的级别中相关的知识,希望对你有一定的参考价值。

我很遗憾所有的SQL东西,我想知道如何实现一个字段,根据他设置的级别和分数给予玩家排名。

What I currently have

What I want

我对mysql不太好,所以我想知道我该怎么做。

答案

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

demo。 对于早期版本:

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

demo。 结果:

| 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    |
另一答案

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

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

但是,如果由于某种原因您必须在数据库级别上拥有它,您始终可以创建一个在一天中的某些时段执行的过程。但是,这可能会导致表格中的数据在执行introduction to procedures程序之前可能不准确。

另一答案

试试这个:

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

以上是关于如何将用户的等级存储在他在SQL表中的分数的级别中的主要内容,如果未能解决你的问题,请参考以下文章

基于同一表上的另一个查询过滤记录的 SQL

一次性集中处理大量数据的定时任务,如何缩短执行时间?

一次性集中处理大量数据的定时任务,如何缩短执行时间?

从左连接获取所有用户ID

如何将json中的数据存储在sql表中(python)

将用户定义表中的日期值传递给 SQL Server 2008 存储过程