首页 > 解决方案 > 从排序表的位置为行赋值

问题描述

我有一个带有行的 MySQL 表:id、score 和 rank。我想创建一个对表进行排序并将新位置分配给表的排名值的触发器,例如:id。缺口。分数。秩

John. 8. ?
Mike. 10. ?
Al. 5. ?
Terry. 12. ? SORT BY score= id nick. score. rank.
Terry. 12. 1
Mike 10. 2
John. 8. 3
Al. 5. 4

我知道如何用句子对表格进行排序ORDER BY score DESC,但我不知道如何将元素的新位置分配给排名。谢谢。

标签: mysqlmariadbwindow-functionsdatabase-triggersql-view

解决方案


我不建议将排名存储在表本身中。这是一个派生信息,可以在需要时动态计算。另一方面,存储它会导致维护它:您会发现自己为每个 DML 操作(更新、插入、删除)创建存储过程。

您可以改为创建一个视图。如果您正在运行 MySQL 8.0 或 MariaDB >= 10.3,则可以使用窗口函数:

create view myview as
select 
    id, 
    score,
    rank() over(order by score desc) rnk
from mytable 

这为您提供了始终最新的数据透视图,且维护成本为 0。

请注意,这rank是一个 SQL 关键字,因此不是列名的好选择 - 我rnk改为命名该列。


推荐阅读