我正在寻找一种更好的方法来进行以下查询.我有一个看起来像这样的表:
game_id | home_team_id | away_team_id
1 | 100 | 200
2 | 200 | 300
3 | 200 | 400
4 | 300 | 100
5 | 100 | 400
Run Code Online (Sandbox Code Playgroud)
我想写一个查询,计算每个团队的主场比赛和客场比赛的数量,并输出以下内容:
team_id | home_games | away_games
100 | 2 | 1
200 | 2 | 1
300 | 1 | 1
400 | 0 | 2
Run Code Online (Sandbox Code Playgroud)
现在,我写了这个怪物有效,但它很慢(我知道它从表中拉出了整整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
Run Code Online (Sandbox Code Playgroud)
SQL大师可以帮我敲出一个更好的方法吗?我认为我的问题是我不明白如何获得一个明确的团队ID列表来抛出计数查询.我敢打赌,有一个更好的放置嵌套SELECT的方法.提前致谢!
小智 9
如果你有另一个有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个游戏,并且因为连接失败,该行不会显示).
| 归档时间: |
|
| 查看次数: |
36604 次 |
| 最近记录: |