database - 如何根据分数计算排名?
问题描述
有一个平台,我们根据用户的积分对用户进行排名。假设有大约 10,000 个条目。数据库如下所示。
ID | 用户名 | 积分 | 秩 |
---|---|---|---|
0 | 建筑师 | 0 | 4 |
1 | 建筑师1 | 15 | 1 |
2 | 建筑师2 | 10 | 2 |
3 | 建筑师3 | 5 | 3 |
每当有人执行某项操作时,他们的分数就会增加或减少,基于此,我还需要更新数据库中的排名。但问题是,每次有人采取行动时,一次又一次地更新它是一个非常缓慢的过程。而且在个人资料上显示排名的同时计算排名也不是一个好方法。
这种问题的理想解决方案应该是什么?
解决方案
为了提高效率,你应该只改变排名,而不是每次都重新计算整个数据。
由于您没有指定编程语言,这里是一个示例伪代码:
-- input variables: CurrID, PointChange
CurrRank = Rank[CurrID]
Points[CurrID] = Points[CurrID] + PointChange
CurrPoints = Points[CurrID]
NewRank = SELECT count(Id) From YourTable where Points >= CurrPoints
if NewRank > CurrRank Then
update YourTable Rank = Rank - 1 where Rank > CurrRank And Rank <= NewRank
else
update YourTable Rank = Rank + 1 where Rank <= CurrRank And Rank > NewRank
end if
Rank[CurrID] = newRank
推荐阅读
- angular - attachment propriety not working in ionic local notification plugin
- flutter - 检查文本小部件是否具有样式
- android - open wrong App via Notification click in same Android device
- docker - Using Traefik with TLS (acme plugin) on non HTTP port for HTTP traffic
- javascript - ajax 成功时如何更改我的班级数据?
- c# - 已解决:如何从 devexpress C# 项目中的 WinForm 中单击下拉按钮打开用户控件 WinForm?
- reactjs - Material-UI 日期选择器的图标不可见
- javascript - 如何防止子组件样式影响父组件?
- unity3d - 为什么统一的相机会不断下落并失去对玩家的追踪,就好像它启用了重力一样?
- javascript - 应用程序工作但会产生错误: Connect(App) 中的 mapDispatchToProps() 必须返回一个普通对象。而是收到未定义的