mysql - 连接表的平均值

标签 mysql sql

我有一个疑问:

SELECT p.NAME, r.DATE, c.NAME, SUM(hs.result), SUM(h.par), (SUM(hs.result) - SUM(h.par)) AS "Score"
 FROM hole_scores hs
 JOIN players p ON hs.player_id = p.id
 JOIN rounds r ON r.id = hs.session_id
 JOIN holes h ON h.id = hs.hole_id 
 JOIN courses c ON c.id = r.course_id
 GROUP BY p.NAME, r.id
 ORDER BY Score ASC

查询给出了这个结果(第一行):

 NAME       DATE        NAME        SUM(hs.result)  SUM(h.par)  Score
Player 1    29.7.2014   Course 1    50              57          -7
Player 2    7.6.2014    Course 2    48              54          -6
Player 1    22.5.2014   Course 1    51              57          -6
Player 3    6.6.2014    Course 1    52              57          -5
Player 1    19.8.2013   Course 1    53              57          -4
Player 4    1.9.2011    Course 1    56              59          -3
Player 5    15.10.2011  Course 1    56              59          -3
Player 4    2.8.2013    Course 1    54              57          -3
Player 1    3.6.2014    Course 1    54              57          -3
Player 6    8.7.2014    Course 1    54              57          -3
Player 4    16.7.2014   Course 1    54              57          -3
Player 1    21.4.2015   Course 1    53              56          -3
Player 2    23.6.2012   Course 2    52              54          -2

如何获得每个玩家的平均得分?

最佳答案

请尝试以下操作...

SELECT players.id AS player_id,
       players.name AS player_name,
       AVG( Score ) AS avg_score
FROM ( SELECT hole_scores.player_id AS player_id,
              ( SUM( hole_scores.result ) - SUM( holes.par ) ) AS Score
       FROM hole_scores
       JOIN holes ON holes.id = hole_scores.hole_id
       JOIN rounds ON rounds.id = hole_scores.session_id
       GROUP BY hole_scores.player_id,
                rounds.id
     ) AS scoreFinder
JOIN players ON players.id = scoreFinder.player_id
GROUP BY players.id
ORDER BY player_name,
         player_id;

此语句使用基于您所提供语句的简化版本的子查询来查找每个玩家每轮回合的分数。

请注意,通常名称不能被安全地假定为唯一,因为通常可能,即使通常情况并非如此,两个玩家可以具有相同的名称。因此,我选择了 id 值来唯一标识每个玩家。由于可以在 hole_scores.player_id 中找到该值,因此此阶段无需加入players

然后,它在子查询的结果和players之间执行INNER JOIN,以便每个playername可能会包含在结果中。我选择在此阶段加入 players 而不是在子查询中加入,因为子查询的结果对于每个 player 仅有一条记录加入子查询的源数据集中的每个玩家,而不是潜在的多个玩家。我希望这将使声明更加高效。

该语句然后根据每个玩家的唯一标识符对连接的数据集的记录进行分组,并返回每个玩家idname值以及每轮结束时他们的分数平均值。

如果您有任何问题或意见,请随时发表评论。

关于mysql - 连接表的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44101232/

相关文章:

java - 将 Java Web 应用程序从 MySQL 迁移到 ORACLE

mysql - MySQL docker容器的性能问题

MySQL基于列值的唯一约束

mysql - 多列连接 : Getting additional rows

sql - 如何在postgres中获取空白之前的所有字符串?

MySQL 创建并使用带有变量的新数据库

java - 在 java swing 中构建后,我的数据库会出现在 jar 文件中吗?

java - 如何使用 spring 的 jdbcTemplate 在 SQL 查询中指定参数

java - com.microsoft.sqlserver.jdbc.SQLServer异常 :incorrect syntax near'='

mysql - mysql 与 sql-92 兼容吗?