Le code suivant compte le nombre de parties jouées, gagnées et perdues par chaque joueur. Cependant, sa longueur et sa complexité posent des problèmes. Comment pouvons-nous simplifier cette requête ?
Utilisez la clause FILTER
pour filtrer les agrégations en fonction d'une expression booléenne :
<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>
Emphase PostgreSQL 9.4 a introduit la clause FILTER
. Pour les anciennes versions, une solution de contournement existe :
<code class="language-sql">SELECT u.name, COUNT(CASE WHEN g.winner_id > 0 THEN 1 END) AS played, COUNT(CASE WHEN g.winner_id = u.id THEN 1 END) AS won, COUNT(CASE WHEN g.winner_id <> u.id THEN 1 END) 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>
Remarque : La solution pour les anciennes versions de PostgreSQL utilise l'instruction CASE
au lieu de la clause FILTER
pour obtenir le même effet. Les deux méthodes calculent avec précision les statistiques de jeu d'un joueur, mais la clause FILTER
a l'avantage d'être plus lisible et maintenable.
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!