动态用户排名

时间:2011-02-06 17:58:49

标签: sql database-design

我有一个基本的业力/代表系统,根据他们的活动(问题,答案等)奖励用户。我希望根据他们的积分获得用户排名(标题)。不同的级别有不同的限制和授权。

排名表

id    rankname   points   questions_per_day
 1    beginner   150      10
 2    advanced   300      30

我不确定是否需要设置下限和上限,但为了简单起见,我只留下了最大点数限制,即150以下的用户是“初学者”且低于或高于超过300,他是'先进'。

例如,拥有157分的Bob将通过其用户名显示“高级”标记。

如何确定并显示用户的排名/标题?我是否遍历每一行并比较值?

如果我将这个问题扩展到数千个以这种方式计算排名的用户,可能会出现什么问题?当每次请求用户的等级时,它会对系统征税以进行查询和循环,不是吗?

2 个答案:

答案 0 :(得分:1)

您可以更好地缓存排名和分数。如果用户的分数仅在执行某些活动时发生更改,则可以对该活动设置触发器。分数更改后,您可以重新计算排名并将其保存在用户记录中。这样,检索排名是微不足道的,你只需要在分数变化时计算它。

您可以像这样获得匹配的排名ID;查询最接近(但低于或等于)用户schore的等级。将此排名ID存储在用户的记录中。 我添加了伪变量{USERSCORE},因为我不知道您是否使用参数或任何其他方式在查询中输入值。

select r.id
from ranks r
where r.points <= {USERSCORE}
order by r.points desc
limit 1

答案 1 :(得分:1)

在不了解您的架构的情况下有点困难。尝试:

SELECT user.id, MIN(ranks.id) AS rankid FROM user JOIN ranks ON (user.score <= ranks.points) GROUP BY user.id;

现在你知道排名了。

虽然这是非平凡的(GROUP BY和MAX是管道破坏者,因此非常重量级的操作),所以GolezTrol建议很好;您应该缓存此信息并仅在用户评分更改时更新它。触发器听起来很好。