当前位置:  开发笔记 > 数据库 > 正文

SQL帮助:使用嵌套SELECT计算单个查询中的行数

如何解决《SQL帮助:使用嵌套SELECT计算单个查询中的行数》经验,为你挑选了1个好方法。

我正在寻找一种更好的方法来进行以下查询.我有一个看起来像这样的表:

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的方法.提前致谢!



1> 小智..:

如果你有另一个有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个游戏,并且因为连接失败,该行不会显示).

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有