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

iq0todco  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(385)

所以这是我的问题,我正在为一个应用程序的等待列表系统工作。当我们启动时,用户将注册以获得通知,并提供推荐链接以帮助“提升”他们在等待列表中的位置。
我遇到的问题是如何在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现在邀请了一个朋友。它们会上升到顶端,但是我该如何对这些数据进行排序呢?可以将整个表重新排序为如下所示:

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

但如果记录超过几百张就不太实用了。也许我没有正确看待这个问题?一定有更简单的解决办法?任何指点或帮助是感激的!谢谢您。

iyzzxitl

iyzzxitl1#

如果您希望排名是基于谁邀请了最多的人,并且如果相同数量的邀请,则是他们的原始排名,请在阅读表格时按此方式排序:

select user from waitlisttable order by invited desc, ranking;

如果在某个更大的查询中需要该顺序,可以为此创建一个视图,但实际上应该避免更新所有现有记录的排名。
如果想得到所有用户的“排名”,请参见如何在mysql查询结果中显示序号。
如果您真的需要能够查找单个用户的排名,那么您可能需要更新所有的行;根据您的负载有多重,您可以通过某个作业每隔x分钟执行一次,或者每次通过触发器更新一行时执行一次。做前者的一个简单例子是:

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

相关问题