如何通过SQL JOIN、COUNT与GROUP BY统计单个球员进球数?
解决按球员ID分组统计进球数的问题
你已经走在正确的路上啦,只是原SQL里有个字段名错误,还有一些符合SQL标准的分组细节需要调整,我帮你修正后就能得到你想要的结果:
原SQL的问题点
- 字段名错误:你写了
teams.name,但你的teams表对应的字段是team_name,这会直接导致查询报错; - 分组的兼容性问题:虽然部分数据库(比如MySQL宽松模式)允许只按
players.id分组就查询其他非聚合字段,但严格遵循SQL标准的话,所有出现在SELECT里的非聚合字段都应该加入GROUP BY(或者被分组字段唯一确定,比如players.id是主键时,其他球员字段没问题,但球队字段最好也明确加入,避免跨数据库兼容问题)。
修正后的SQL语句
SELECT players.first_name, players.last_name, teams.team_name, players.position, players.age, COUNT(goals_scored.id) AS goals FROM players JOIN goals_scored ON players.id = goals_scored.player_id JOIN teams ON players.team_id = teams.id GROUP BY players.id, players.first_name, players.last_name, teams.team_name, players.position, players.age;
补充说明
- 用
COUNT(goals_scored.id)代替COUNT(*):这样更精准地统计有效的进球记录(如果后续改成LEFT JOIN包含无进球球员时,会返回0而不是1,更符合逻辑); - 完整的
GROUP BY列表:确保在任何SQL模式下都能正常运行,不会出现分组相关的报错; - 如果你的数据库支持功能依赖分组(比如PostgreSQL 10+、MySQL开启
ONLY_FULL_GROUP_BY但依赖主键),可以简化GROUP BY为GROUP BY players.id,因为players.id是主键,其他球员字段都由它唯一确定,而teams.team_name通过players.team_id关联到teams.id,也属于功能依赖的范畴,这样写更简洁:
SELECT players.first_name, players.last_name, teams.team_name, players.position, players.age, COUNT(goals_scored.id) AS goals FROM players JOIN goals_scored ON players.id = goals_scored.player_id JOIN teams ON players.team_id = teams.id GROUP BY players.id;
测试结果验证
用你提供的测试数据运行修正后的SQL,会得到完全符合你期望的结果:
first_name | last_name | team_name | position | age | goals -----------|------------|-----------|----------|-----|------ Dipendra | Shrestha | APF Club | forward | 19 | 2
内容的提问来源于stack exchange,提问作者Dipendra Shrestha
相关产品推荐
相关产品推荐

