创建等待列表系统并重新排列用户

Creating a waiting listing system and re-ranking users

所以这是我的问题,我正在为一个应用开发等待列表系统。用户会注册以在我们启动时收到通知,并提供推荐链接以帮助 "boost" 他们在等候名单中的位置。

我遇到的问题是我应该如何在 MySQL 或 NoSQL 数据库中对它们进行排名。如果我的数据库如下所示,我 运行 遇到的问题是:

User  | Ranking | Invited
-------------------------
user1 |    1    |    0
user2 |    2    |    0
user3 |    3    |    0
user4 |    4    |    0
user5 |    5    |    0
user6 |    6    |    0
user7 |    7    |    0
user8 |    8    |    1

现在,假设user8现在邀请了1位好友。他们被推到顶部,但我该如何对这些数据进行排序?可以将整个 table 重新排序为如下所示:

User  | Ranking | Invited
-------------------------
user1 |    2    |    0
user2 |    3    |    0
user3 |    4    |    0
user4 |    5    |    0
user5 |    6    |    0
user6 |    7    |    0
user7 |    8    |    0
user8 |    1    |    1

但是如果记录超过几百条就不太实用了。也许我没有以正确的方式看待这个问题?必须有一个更简单的解决方案?任何指针或帮助表示赞赏!谢谢。

如果你想排名是根据谁邀请的人最多,如果邀请的人数相同,他们的原始排名,当你阅读table时这样排序:

select user from waitlisttable order by invited desc, ranking;

如果您在一些较大的查询中需要该顺序,您可以为此创建一个视图,但绝对应该避免实际更新所有现有记录的排名。

如果要为所有用户获取 "rank",请参阅 How to show sequential number in MySQL query result

如果您确实需要能够查找单个用户的排名,那么您可能确实需要更新所有行;根据您的负载有多重,您可以每 X 分钟通过某个作业执行一次,或者每次通过触发器更新一行时执行一次。做前者的一个简单例子是:

set @rank:=0;
update waitlisttable set ranking=(@rank:=@rank+1) order by invitations desc, initial_ranking;