本文解决了在 PostgreSQL 中高效检索玩家游戏统计数据的问题,特别关注玩家姓名、玩过的游戏、赢的游戏和输的游戏。 挑战在于整合数据,玩家可以以 player_1
或 player_2
的身份参与。 传统方法通常涉及多个重复查询。
对于 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>
对于所有 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>
这些优化的查询有效地聚合玩家统计数据,避免冗余查询并提高性能。 选择合适的方法取决于您的 PostgreSQL 版本。
以上是如何在 PostgreSQL 中高效聚合玩家游戏统计数据?的详细内容。更多信息请关注PHP中文网其他相关文章!