Le code suivant récupère les données de trois colonnes agrégées distinctes : parties jouées, parties gagnées et parties perdues. Bien que ce code fonctionne comme prévu, il est répétitif et potentiellement difficile à maintenir. Pour simplifier cette requête, envisagez d'utiliser les fonctionnalités avancées de PostgreSQL.
PostgreSQL 9.4 et supérieur
PostgreSQL 9.4 introduit une nouvelle clause d'agrégation FILTER. Cette clause vous permet d'appliquer un filtre à un calcul agrégé, en considérant uniquement les lignes qui satisfont à l'expression booléenne spécifiée.
<code class="language-sql">SELECT u.name , count(*) FILTER (WHERE g.winner_id > 0) AS played , count(*) FILTER (WHERE g.winner_id = u.id) AS won , count(*) FILTER (WHERE g.winner_id != u.id) AS lost FROM games g JOIN users u ON u.id IN (g.player_1_id, g.player_2_id) GROUP BY u.name;</code>
Versions PostgreSQL antérieures à 9.4
Pour les versions antérieures de PostgreSQL, vous pouvez utiliser une expression (expression OU NULL) comme solution de contournement.
<code class="language-sql">SELECT u.name , count(g.winner_id > 0 OR NULL) AS played , count(g.winner_id = u.id OR NULL) AS won , count(g.winner_id != u.id OR NULL) AS lost FROM games g JOIN users u ON u.id IN (g.player_1_id, g.player_2_id) GROUP BY u.name;</code>
Cette solution de contournement est plus courte et plus rapide que l'utilisation de sous-sélections imbriquées ou d'expressions CASE. Pour d’autres considérations d’optimisation, consultez les références mentionnées dans les réponses fournies.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!