答案 0 :(得分:1)
计算值不是应该存储在表中的值。类似的例子是年龄。您不存储用户的年龄,而是存储其DOB。在讨论数据库建模时,不断变化的值是一个复杂的问题。
此类型的问题有一个名称。它称为尺寸的缓慢变化wiki-link。因此,我建议您在应用程序中实现任何计算逻辑,而不是将其存储在数据库中。
但是,如果由于某种原因您必须在数据库级别上拥有它,则可以始终创建一个在一天的特定时段执行的过程。但是,这可能会导致以下情况:在执行该过程之前,表中的数据可能不正确introduction to procedures。
答案 1 :(得分:1)
对于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 |
答案 2 :(得分:0)
尝试一下:
select level,user,score,
rank() over(partition by level order by score desc) as rank
from Tablename;