You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SQL JOIN、COUNT与GROUP BY统计单个球员进球数?

解决按球员ID分组统计进球数的问题

你已经走在正确的路上啦,只是原SQL里有个字段名错误,还有一些符合SQL标准的分组细节需要调整,我帮你修正后就能得到你想要的结果:

原SQL的问题点

  1. 字段名错误:你写了teams.name,但你的teams表对应的字段是team_name,这会直接导致查询报错;
  2. 分组的兼容性问题:虽然部分数据库(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:35:02