获取得分表中的用户排名

xpszyzbs  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(379)

我正在使用laravel,这可能是我的用户表:

id|score
1|10
2|13
3|15
4|7
5|11

用户可以看到具有两个等级的页面:等级a和等级b。
等级a
前10名用户的得分,两种可能的情况:用户谁看到这个排名是在前10名用户与否。
前10个用户:获取10个用户的列表
用户不在前10个:获取11个用户的列表(前10个+当前用户在所有用户中的位置)
等级b
前10名用户按得分在一组给定的id中(有时可能是1有时是10有时是0),相同的两种情况:用户是否在前10名。
前10个用户:获取10个用户的列表
不在前10个用户中的用户:获取11个用户的列表(前10个+当前用户在ID组中的位置)
有什么方法可以用雄辩的语言来表达吗?否则我怎么在mysql中实现呢?

dxxyhpgq

dxxyhpgq1#

为了获得第一名,你可以用雄辩的语言:

$users = User::orderBy('score', 'DESC')->limit(10)->get();
$currentUser = Auth::user();
$currentUserId = $currentUser->id;
if (!$users->contains('id', $currentUserId)) {
    $users->push($currentUser);
}

$users 将按得分排序,如果当前用户不在前10名中,则他比列表中的最后一个得分更差,因此将其添加到末尾是有意义的。
对于第二级:

$idsFilter = [1, 2, 3, 4, 5];
$users = User::whereIn('id', $idsFilter)->orderBy('score', 'DESC')->limit(count($idsFilter))->get();
$currentUser = Auth::user();
$currentUserId = $currentUser->id;
if (!$users->contains('id', $currentUserId)) {
    $users->push($currentUser);
}
return $users;

因为您需要一个固定的id列表来进行排序,所以只有显示id才有意义,如果当前用户不是您要求的前x个id的一部分,那么添加他也是有意义的。
要获得用户在等级a中的位置,可以在 User 模型如:

public function getPosition()
{        
    return DB::raw("SELECT COUNT(*) + 1
                    FROM users
                    WHERE score > {$this->score}");
}

并使用相同的过程在等级b的id上添加一个过滤器。

相关问题