我的 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/