Как сделать заказ до суммы - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть следующие таблицы:

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 команды получают одинаковое общее количество очков, поэтому нам нужно показать команду, которая смогла набрать это количество очков первым в списке, прежде чем другие (на основе ответов в колонке creation_at)

Я могучтобы получить этот список, используя следующий запрос, но не в состоянии сортировать по столбцу answer_user create_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)')

Однако я хочу, чтобы на самом деле работали обе агрегации.По сути, находя общее количество очков, набранных каждой командой, затем сортируйте их по времени, сначала набирается одно шоу первым.

1 Ответ

0 голосов
/ 04 апреля 2019

Пожалуйста, попробуйте использовать функцию 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...