laravel query builder-返回组合项的最大值

oxiaedzo  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(339)

使用laravel的查询生成器,我试图获得特定游戏的综合最高分数。
我目前有我的方法,下面找到一个游戏的最高分数。

public function getHighestScore()
{
    return DB::table('scores')
        ->join('games', 'scores.game_id', '=', 'games.id')
        ->join('users', 'scores.user_id', '=', 'users.id')
        ->select('scores.score as return')
        ->where('scores.game_id', $this->id)
        ->get()->max('return');
}

这么叫

$game = Game::find(5);
$game->getHighestScore();

正确输出

784

不过,现在我需要能够获得最高(综合用户得分)的游戏,并获得该用户的id。我真的想实现这一点,如果可能的话,一个单一的查询?
我的分数表如下:

+---------+----------+----------+--------+
| id      | game_id  | user_id  | score  |
+---------+----------+----------+--------+
| 97      |        5 |        3 |    234 |
| 123     |        3 |        3 |    102 |
| 300     |        5 |        1 |     99 |
| 422     |        5 |        1 |    784 |
| 531     |        5 |        3 |    221 |
| 612     |        3 |        3 |    222 |
| 798     |        3 |        3 |    379 |
+---------+----------+----------+--------+

比如:

$game = Game::find(5);
$game->getUserWithHighestCombinedScore();

这可能吗?我的查询必须包括什么?
为了帮助澄清,我包括以下内容。
如果要合并每个游戏的用户id得分,则假设表如下所示:

+---------+----------+----------+-----------------+
| id      | game_id  | user_id  | combined_score  |
+---------+----------+----------+-----------------+
|         |        5 |        3 |             455 | 
|         |        5 |        1 |             883 |  
|         |        3 |        3 |             703 |  
+---------+----------+----------+-----------------+

打个电话给

$game->getUserWithHighestCombinedScore();

都会回来的

// user_id
1
// combined_score of
883

所以他们需要在 ->select() 属性。
这可能吗?

p5cysglq

p5cysglq1#

首先,对于你的第一个问题,我认为你不需要那么多 joins 你可以这么做。

return DB::table('scores')->where('game_id', $this->id)->max('score');

对于你的问题,我认为这应该管用。

return DB::table('scores')
        ->where('game_id', $this->id)
        ->select('user_id', DB::raw('SUM(score) as total'))
        ->groupBy('user_id')
        ->orderByDesc('Total')
        ->take(1)
        ->get();

相关问题