0
votes

Condition de requête si rien n'ajouer 0

J'ai une requête 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();


2 commentaires

Avez-vous un modèle éloquent configuré pour pickup_results et si vous avez ainsi une relation configurée entre elle et un modèle ?


Y a-t-il des lignes dans la table pour eux du tout s'ils n'ont pas eu de victoire ou de perte?


3 Réponses :


0
votes

Il vous donnera gagne code> et perte code> dans votre résultat. Il suffit d'ajouter un sinon code> dans votre cas code> et mettez une condition de comptage supplémentaire pour Dessine code>. Ajoutez plus de 1 OrderBy code> pour une meilleure représentation des résultats.

$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();


0 commentaires

0
votes

Vous pouvez utiliser somme () au lieu de compteur () et ajoutez un else 0 à la requête. Exemple pour la première occurrence: xxx

ou vous pouvez utiliser coalesce (requête, 0) : xxx

Cela fonctionne parce que compte () renvoie null si tous les éléments comptés sont null .


1 commentaires

Quelle est l'erreur que vous obtenez? Et quel système de base de données utilisez-vous autrement? Mysql?



1
votes

En supposant qu'il n'y ait pas de rangée dans la table si le joueur n'a pas eu de victoire ou une perte, votre requête ne pourra jamais renvoyer aucun résultat.

Une option (en supposant que vous avoir un lecteurs cod> table) consisterait à interroger la table code> lecteurs de code> puis rejoindre le pickup_results code>: p> xxx Pré>

Alternativement, car vous utilisez get () code> avec votre requête Une collection sera renvoyée quel que soit les résultats afin que vous puissiez chaîner sur le QUEMTEMENT () Méthode à la place: P>

$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 commentaires