在分数表中获取用户排名

时间:2018-11-14 22:27:32

标签: mysql laravel

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

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

用户可以看到具有两个等级的页面:等级A和等级B。

排名A

按分数排名的前10位用户,有两种可能的情况:看到此排名的用户是否在前10位用户中。

前10位用户:获取10位用户列表

不在前10名中的用户:获取11名用户的列表(前10名以上的当前用户在所有用户中排名)

RANK B

给定ID组中按分数排序的前10个用户(有时可能是1,有时是10,有时是0),这两种情况相同:该用户是否在前10名中。

前10位用户:获取10位用户列表

不在前10名中的用户:获取11名用户的列表(前10名+当前用户在ID组中的位置)

有什么办法可以用Eloquent吗?否则我该如何在MySql中做到这一点?

1 个答案:

答案 0 :(得分:1)

要获得第一名,您可以使用Eloquent:

$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上添加一个过滤器。