需要通过EXP栏实现TOP 100用户,如果当前用户不在顶部,则在下方单独显示当前用户的位置,
如何显示TOP 100就很清楚了:
$top = User::orderBy('exp', 'DESC')->select('name', 'exp')->limit(100)->get();
如果我们知道当前用户的位置,那么我们可以检查它是否超过 100 或更少,如果更多,则显示当前用户的位置在 TOP 100 以下,如果更少,则foreach对结果进行排序列表,找到用户并选择他。
问题是我不明白如何计算当前用户的位置,原则上可以在表
中添加一个新列,例如每小时遍历一次所有用户(按exp desc排序)并保存当前 领域 中 的 位置
. 但是 如果 有 超过 1 ml 的 用户 怎么办 , 然后 遍历 所有 用户 并 更改 每个 用户将 太 昂贵 了placeusersplaceplace
您可以包装这样的查询(基于SQL Find Position in table):
好吧,或者只计算更高的用户数(比当前用户拥有更多 exp):
如果您需要一个位置范围(如果许多 exp 相同),那么前面的请求会使用
>and执行两次>=。