次のコードは、プレイされたゲーム、勝ったゲーム、負けたゲームという 3 つの別々の集計列のデータを取得します。このコードは期待どおりに機能しますが、繰り返しが多く、保守が困難になる可能性があります。このクエリを簡素化するには、高度な PostgreSQL 機能の使用を検討してください。
PostgreSQL 9.4 以降
PostgreSQL 9.4 では、新しい集計 FILTER 句が導入されています。この句を使用すると、指定したブール式を満たす行のみを考慮して、集計計算にフィルターを適用できます。
<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>
9.4 より前の PostgreSQL バージョン
PostgreSQL の以前のバージョンでは、回避策として式 (式 OR NULL) を使用できます。
<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>
この回避策は、ネストされた副選択または CASE 式を使用するよりも短くて高速です。最適化に関するさらなる考慮事項については、提供された回答に記載されている参考資料を参照してください。
以上がPostgreSQL で個別のフィルターを使用して列を効率的に集計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。