MySQL 使用连接和查询来聚合统计信息

MySQL using joins and queries to aggregate stats

我有以下查询非常有效。

SELECT possession_team AS Team, ball_carrier_receiver AS Player,
    sum(run_pass='P') AS TAR,
    sum(pass_result='C') AS REC, 
    sum(gain) AS YDS,
    ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
    max(gain) AS LG,
    sum(series_end='Touchdown' AND pass_result='C') AS TD,
    ROUND((sum(pass_result='C') / sum(run_pass='P')) * 100,1) AS 'COM%'
FROM plays 
WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R'
GROUP BY possession_team, ball_carrier_receiver;

但我需要让球员的名字与他的统计数据相匹配,这样输出将是 PLAYER NAME、TEAM、JERSEY,然后是他的统计数据总和。

我还有一个叫 game_rosters 的 table 。这有 first_name、last_name、team_code 和 jersey_number。 Team_code = possession_team 出自剧本 table, jersey_number = ballcarrier_receiver_number 出自剧本 table.

我尝试了很多不同的语句和连接,但我无法弄清楚。下面是我最接近的代码,但它只输出多次列出的球员姓名、球队和球衣(但也列出了没有累积任何这些统计数据的球员),没有任何统计数据的汇总。

SELECT concat(fgr.last_name,',',' ',fgr.first_name) AS Player, possession_team AS Team, ball_carrier_receiver AS Jersey FROM football.game_rosters AS fgr
LEFT JOIN football.plays AS fplays ON (fgr.jersey_number = fplays.ball_carrier_receiver);
sum(run_pass='P') AS TAR,
sum(pass_result='C') AS REC, 
sum(gain) AS YDS,
ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
max(gain) AS LG,
FROM fplays WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R'
GROUP BY fplays.ball_carrier_receiver;

编辑:

在阅读了下面 Barmar 的 link 之后,我尝试使用从 game_rosters table 播放的总和来执行子查询。 运行 搞不定,我怕把它弄得一团糟。

SELECT ball_carrier_receiver AS Jersey, possession_team AS Team
FROM plays AS p
LEFT JOIN (
    SELECT CONCAT(last_name,', ',' ',first_name) AS Player, team_code AS TEAM,
           sum(played) AS GP
    FROM game_rosters AS gr
    GROUP BY team_code, jersey_number
) AS m
    ON m.jersey_number = p.ball_carrier_receiver AND p.possession_team = m.team_code
LEFT JOIN (
    SELECT ball_carrier_receiver AS Jersey, possession_team AS Team,
           sum(run_pass='P') AS TAR,
           sum(pass_result='C') AS REC, 
           sum(gain) AS YDS,
           ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
           max(gain) AS LG,
           sum(series_end='Touchdown' AND pass_result='C') AS TD,
           ROUND((sum(pass_result='C') / sum(run_pass='P')) * 100,1) AS 'COM%'
    FROM plays
    WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R' AND play_null='N'
    GROUP BY possession_team, ball_carrier_receiver ORDER BY TAR DESC
) as n
    ON m.jersey_number = n.ball_carrier_receiver AND n.possession_team = m.team_code;

只需在 FROM 子句后加上 JOINgame_rosters

SELECT possession_team AS Team, CONCAT(first_name, ' ', last_name) AS Player, 
    sum(run_pass='P') AS TAR,
    sum(pass_result='C') AS REC, 
    sum(gain) AS YDS,
    ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
    max(gain) AS LG,
    sum(series_end='Touchdown' AND pass_result='C') AS TD,
    ROUND((sum(pass_result='C') / sum(run_pass='P')) * 100,1) AS 'COM%'
FROM plays AS p
JOIN game_rosters AS gr 
    ON gr.jersey_number = p.ball_carrier_receiver AND p.possession_team = gr.team_code
WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R'
GROUP BY possession_team, ball_carrier_receiver;