我正在寻找一种更好的方法来进行以下查询.我有一个看起来像这样的表:
game_id | home_team_id | away_team_id 1 | 100 | 200 2 | 200 | 300 3 | 200 | 400 4 | 300 | 100 5 | 100 | 400
我想写一个查询,计算每个团队的主场比赛和客场比赛的数量,并输出以下内容:
team_id | home_games | away_games 100 | 2 | 1 200 | 2 | 1 300 | 1 | 1 400 | 0 | 2
现在,我写了这个怪物有效,但它很慢(我知道它从表中拉出了整整2800行).
SELECT home_team_id as team_id, (SELECT count(*) FROM `game` WHERE home_team_id = temp_game.home_team_id) as home_games, (SELECT count(*) FROM `game` WHERE home_team_id = temp_game.away_team_id) as away_games FROM (SELECT * FROM `game`) as temp_game GROUP BY home_team_id
SQL大师可以帮我敲出一个更好的方法吗?我认为我的问题是我不明白如何获得一个明确的团队ID列表来抛出计数查询.我敢打赌,有一个更好的放置嵌套SELECT的方法.提前致谢!
如果你有另一个有team_id和team_name的表团队,那就更清晰了.
SELECT team_id, team_name, sum(team_id = home_team_id) as home_games, sum(team_id = away_team_id) as away_games FROM game, team GROUP BY team_id
发生了什么:no WHERE子句导致两个表之间的笛卡尔积; 我们按team_id分组,以便每个团队返回一行.现在,每个team_id都有游戏表中的所有行,因此您需要对它们进行计数,但SQL计数函数不是很正确(它会计算所有行或所有不同的行).所以我们说team_id = home_team_id解析为1或0,我们使用sum来加1.
team_name只是因为当我们说'泥城扼杀者有20场主场比赛'时,说'200队有20场主场比赛'是令人讨厌的.
PS.即使没有游戏,这也会有效(在SQL中通常存在一个问题,即团队中有0个游戏,并且因为连接失败,该行不会显示).