创建等待列表系统并重新排列用户
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;
所以这是我的问题,我正在为一个应用开发等待列表系统。用户会注册以在我们启动时收到通知,并提供推荐链接以帮助 "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;