MySQL 计算多个分组列上的行数

标签 mysql

我的 MySQL 表有以下结构:

-------------------------------------------
                 Goal
-------------------------------------------
GoalID  |  GameID  |  ScorerID  |  AssistID
-------------------------------------------
   1          1          1            2
   2          1          2            3
   3          1          2           null
   4          1          3            2
   5          2          1            3
   6          2          1           null


----------------------
       Player
----------------------
PlayerID  |  LastName
----------------------
   1            AB    
   2            CD  
   3            EF  

现在,我想要实现的是:

-------------------------------------------
GameID  |  Player  |  Goals  |  Assists
-------------------------------------------
   1         AB          1         0
   1         CD          2         2
   1         EF          1         1
   2         AB          2         0
   2         EF          0         1

这是我尝试过的方法,但它给了我错误的结果:

SELECT Goal.GoalID,
   Goal.GameID,
   COUNT(Scorer.PlayerID) AS Goals,
   COUNT(Assist.PlayerID) AS Assists,
   Player.LastName AS Player
FROM Goal
LEFT JOIN Player Player
       ON Player.PlayerID = Goal.ScorerID
       OR Player.PlayerID = Goal.AssistID
LEFT JOIN Player Scorer
       ON Scorer.PlayerID = Goal.ScorerID
LEFT JOIN Player Assist
       ON Assist.PlayerID = Goal.AssistID
GROUP BY Player,
         Goal.GameID
ORDER BY Goal.GameID,
         Goal.GoalID

我很确定有一种简单的方法可以得到结果,但我就是无法理解这个方法。

最佳答案

您可以使用条件聚合来完成此操作。为此,您在球员id与scorerid或assist id匹配的情况下加入球员和目标表,然后获得球员id在score或assist列中的情况的SUM(),最终分组游戏 ID 和玩家 ID。像这样:

SELECT g.gameID, p.lastName AS Player, SUM(g.scorerID = p.playerID) AS goals, SUM(g.assistID = p.playerID) AS assists
FROM goal g
JOIN player p ON p.playerID = g.scorerID OR p.playerID = g.assistID
GROUP BY g.gameID, p.playerID;

这是一个 SQL Fiddle示例。

请务必注意,此示例假设玩家至少有一个进球或至少有一次助攻。如果您想要两者都没有的玩家,您可以使用外部连接。

关于MySQL 计算多个分组列上的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29706480/

相关文章:

mysql - 获取要选择的 SQL 查询

sql - 测试 MySQL 表中是否存在行的最佳方法

mysql - 选择对象中综合得票数前 10% 的集合

mysql - 使 SQL 查询更快

java - JPA2 - 使用 Criteria API 作为动态查询递归获取连接实体的子实体

php - 日期未在控制台中显示为字符串

php - 为什么两个单独的 MySQL 语句会相互复制?

python - 将 netCDF 数据存储到 couchbase 中

MySQL datetime 以天、小时和分钟为单位的差异

java - 将 Twitter 数据从 Java 插入到 MySQL