【发布时间】:2016-04-23 09:09:19
【问题描述】:
我有一个球员与比赛的关系表以及他们在每场比赛中的得分。我正在尝试做一个选择,在其中我得到一个不同的球员名单,他们的总得分以及他们参加过的所有球队的总得分。由于一切都是针对单个玩家的,我不知道如何仅针对单个列摆脱 GROUP BY 范围。对于下面的例子,我只会说每支球队只有两名球员。在实际的数据库中,如果重要的话,每个团队都有五个。谢谢大家。
表“匹配”:
match_id | winning_team |
56427859 | 0 |
56427860 | 1 |
56427861 | 1 |
56427862 | 0 |
56427863 | 1 |
etc...
表格“match_players”:
match_id | team | player_id | points |
56427859 | 0 | 10 | 3 |
56427859 | 0 | 33 | 1 |
56427859 | 1 | 26 | 0 |
56427859 | 1 | 39 | 2 |
56427860 | 0 | 23 | 1 |
56427860 | 0 | 33 | 3 |
56427860 | 1 | 18 | 1 |
56427860 | 1 | 10 | 4 |
etc...
期望的结果:
player_id | match_count | total_points | team_total_points | <- This should be
the total of all
10 | 2 | 7 | 9 | points scored by
18 | 1 | 1 | 5 | the player and
23 | 1 | 1 | 4 | his teammates
26 | 1 | 0 | 2 | in all matches.
33 | 2 | 4 | 8 |
39 | 1 | 2 | 2 |
查询:
SELECT
p.player_id,
COUNT(*) AS match_count,
SUM(CASE WHEN mp.team = m.winning_team THEN 1 ELSE 0 END) AS win_count,
SUM(points) AS total_points,
[________________________________________] AS team_total_points
FROM matches m
INNER JOIN match_players mp ON m.match_id = mp.match_id
INNER JOIN players p ON mp.player_id = p.player_id
GROUP BY player_id
ORDER BY player_id
编辑:
“球队”列简单地定义了红色或蓝色、主场或客场等。球员可以在不同的比赛中加入不同的球队。并且玩家可以在比赛之间交换球队,比如课间躲避球。
【问题讨论】:
-
如何定义“团队”?
-
对,对不起。只有两个。基本上,团队只是意味着主场和客场。玩家可以随时加入任何团队。就像躲避球一样。我会编辑我的帖子。
-
编写一个子查询来计算每个球员的球队总数。将该子查询与您的主查询连接起来,并将总数填空。
-
我尝试了类似的方法,但由于某种原因我无法获得队友的分数。括号内的任何“(SELECT SUM(points)...”都不会返回每个特定玩家的积分的总和,而其他人的积分都不是由于 group by 吗?对不起,我对 SQL 的理解很差。
-
@Barmar - 哦,你的意思是像 Vitto 在他的帖子中展示的那样。好的,我会试试的。谢谢。