以下代码计算每个玩家玩过的、赢过的和输过的游戏次数。但是,它的长度和复杂性带来挑战。我们如何简化此查询?
利用 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>
强调 PostgreSQL 9.4 引入了 FILTER
子句。对于旧版本,存在一种解决方法:
<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>
注意: 对旧版本PostgreSQL的解决方案使用了CASE
语句代替FILTER
子句,达到相同的效果。 这两种方法都能准确计算玩家的游戏统计数据,但FILTER
子句在可读性和可维护性方面更具优势。
以上是如何在 PostgreSQL 中使用不同的过滤器简化游戏统计数据的聚合?的详细内容。更多信息请关注PHP中文网其他相关文章!