Условие запроса, если ничего не добавлено 0 - PullRequest
0 голосов
/ 06 января 2019

У меня есть запрос Laravel 5.7

$captains = DB::table('pickup_results')
    ->select(DB::raw("playerID"),
        DB::raw("COUNT(CASE WHEN gameResult = 'Win'  THEN 1 END) AS wins"),
        DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"))
    ->where('pickOrder', '=', 0)
    ->where('playerID', '=', $playerID)
    ->groupBy('playerID')
    ->orderBy('wins','DESC')
    ->get();

Если идентификатор игрока не имеет «выигрыша» или «проигрыша», он не добавит ключ wins или loss к результатам запроса - что приведет к ошибкам, когда у пользователя нет выигрышей или нет потери в базе данных.

Я бы хотел иметь возможность по умолчанию wins или loss до 0, если значение не существует в базе данных.

Может ли кто-нибудь помочь мне понять, как я могу достичь?

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Вы можете использовать SUM() вместо COUNT() и добавить ELSE 0 к запросу. Пример для первого появления:

DB::raw("SUM(CASE WHEN gameResult = 'Win' THEN 1 ELSE 0 END) AS wins")

Или вы можете использовать COALESCE(query, 0):

DB::raw("COALESCE(COUNT(CASE WHEN gameResult = 'Win' THEN 1 END), 0) AS wins")

Это работает, потому что COUNT() возвращает NULL, если все подсчитанные элементы равны NULL.

0 голосов
/ 06 января 2019

Если предположить, что в таблице не будет строки, если у игрока нет выигрыша или проигрыша, тогда ваш запрос не даст никаких результатов.

Один из вариантов (при условии, что у вас есть таблица players) - запросить таблицу players и затем присоединиться к pickup_results:

.
$captains = DB::table('players')
        ->leftJoin('pickup_results', 'players.id', 'pickup_results.playerID')
        ->select('users.id as user_id',
            DB::raw("COUNT(CASE WHEN results.gameResult = 'Win'  THEN 1 END) AS wins"),
            DB::raw("COUNT(CASE WHEN results.gameResult = 'Lose' THEN 1 END) AS loss"))
        ->where('players.id', $playerID)
        ->where('pickup_results.pickOrder', 0)
        ->groupBy('players.id')
        ->orderBy('wins', 'DESC')
        ->get();

В качестве альтернативы, поскольку вы используете get() с запросом, коллекция будет возвращена независимо от результатов, поэтому вместо нее можно использовать метод whenEmpty () :

$captains = DB::table('pickup_results')
    ->select('playerID',
        DB::raw("COUNT(CASE WHEN gameResult = 'Win'  THEN 1 END) AS wins"),
        DB::raw("COUNT(CASE WHEN gameResult = 'Loss' THEN 1 END) AS loss"))
    ->where('pickOrder', 0)
    ->where('playerID', $playerID)
    ->groupBy('playerID')
    ->orderBy('wins', 'DESC')
    ->get()
    ->whenEmpty(function ($items) use ($playerID) {
        return $items->push((object)[
            'playerID' => $playerID,
            'wins'     => 0,
            'loss'     => 0,
        ]);
    });
0 голосов
/ 06 января 2019

Это даст вам wins и loss в вашем результате. Просто добавьте условие else в ваш case и добавьте дополнительное условие подсчета для draw. Добавьте более 1 orderBy для лучшего представления результатов.

$captains = DB::table('pickup_results')
    ->select(DB::raw("playerID"),
        DB::raw("SUM(CASE WHEN gameResult = 'Win'  THEN 1 ELSE 0 END) AS wins"),
        DB::raw("SUM(CASE WHEN gameResult = 'Loss' THEN 1 ELSE 0 END) AS loss")),
       DB::raw("SUM(CASE WHEN gameResult != 'Win' and gameResult != 'Loss' THEN 1 ELSE 0 END) AS draws"))
    ->where('pickOrder', '=', 0)
    ->where('playerID', '=', $playerID)
    ->groupBy('playerID')
    ->orderBy('wins','DESC')
    ->orderBy('draws','DESC')
    ->orderBy('loss','ASC')
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...