0

我有以下表格:

competitions (id, ...)
questions (id, ...)
teams (id, ...)
team_user (id, user_id, team_id, ...)
answer_user (user_id, competition_id, question_id, points, ...)

我正在尝试建立一个查询来列出参加比赛 id = 20 的所有团队,因为我们根据团队用户积分的累积对列表进行排序。但是,有时 2 支球队获得相同的总分,因此我们需要先在列表中显示能够达到该总分的球队在其他球队之前(基于答案 created_at 列)

我可以使用以下查询获取此列表,但无法根据 answer_user created_at 列进行排序:

$ranks = Team::withCount(['answers' => function ($q) use ($competition_id) {   
        $q->where('competition_id', $competition_id)
            ->select(DB::raw('sum(points)'));
    }])
    ->where('competition_id', $competition_id)
    ->orderBy('answers_count', 'desc')
    ->get();

编辑 1 我可以在替换时实现所需的排序

->select(DB::raw('sum(points)')

->select(DB::raw('max(answer_user.created_at)')

但是,我实际上希望这两个聚合都可以工作。基本上,找到每支球队的总得分,然后根据时间排序,首先得分是先显示的。

4

1 回答 1

0

请尝试使用sortBy()sortByDesc()功能后get()

https://laravel.com/docs/5.8/collections#method-sortbydesc

    $ranks = Team::withCount(['answers'=>function($q) use($competition_id){         
                $q->where('competition_id',$competition_id)->select(DB::raw('sum(points)'));
}])->where('competition_id',$competition_id)->get()->sortByDesc('answer_user');
于 2019-04-04T10:56:25.960 回答