我正在使用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 +当前用户在ids组中的位置)
有什么办法能用雄辩的口才来做吗?否则,我如何在MySql中做到这一点?
发布于 2018-11-14 22:49:28
为了获得第一名,你可以用雄辩的口才做到这一点:
$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;因为您希望有一个固定的if列表来排序,所以只有当当前用户不是您所要求的顶级X if的一部分时,才有必要显示if,并添加当前用户。
要获得A级用户的位置,可以在User模型上执行如下方法:
public function getPosition()
{
return DB::raw("SELECT COUNT(*) + 1
FROM users
WHERE score > {$this->score}");
}并在B级的ids上添加一个过滤器,并使用相同的进程。
https://stackoverflow.com/questions/53309668
复制相似问题