我可能也有一些设计问题,但如果有可能做我现在所做的设计,我宁愿这样做,然后继续学习和优化。
我有一个gameresults表,每个游戏有两行(一个用于家庭,一个用于离开)。 也就是说,有一个带有teamid 1的行gameid 1(目标,积分等)然后另一行gameid 1有一个teamid 2的条目(目标,积分等)。 Gamesresults还有联盟ID(了解游戏所属的联赛)和categoryid(一个联盟可以有几个类别)。
我对游戏结果的PK是gameid + teamid。
我认为,由于我不仅仅是在查看排名而不是输入游戏数据,因此我可以复制一些字段,以便更简单的查询来构建排名。
我还有一个团队表,其中我有团队ID,名称等团队,并且还包含一个categoryid来描述团队所属的类别。
我的目标是能够为每个团队检索目标,积分,比赛等的汇总数据并包含团队名称。
另外,如果联盟中的球队已经没有在比赛中打过任何比赛,我希望能够列出所有0的值。
我尝试过不同的查询和左/右连接组合等。
我想出的最好的是:
SELECT
teams.TeamID,
teams.TeamName,
SUM(PointsAwarded) as PTS,
SUM(TotalGF) as GF,
SUM(TotalGA) as GA,
COUNT(IDGame) as GP,
SUM(CASE WHEN PointsAwarded=2 THEN 1 ELSE 0 END) as W,
SUM(CASE WHEN PointsAwarded=1 THEN 1 ELSE 0 END) as O,
SUM(CASE WHEN PointsAwarded=0 THEN 1 ELSE 0 END) as L
from Teams
left join gamesresults on teams.TeamID = gamesresults.idteam
where Teams.TeamcategoryID=1 and gameresults.idleague=1
group by teams.TeamID, teams.TeamName
order by pts desc
这给了我所有球队,除了那些没有参加比赛的球队。
如果我这样做(我从where子句中删除了联盟):
SELECT
teams.TeamID,
teams.TeamName,
SUM(PointsAwarded) as PTS,
SUM(TotalGF) as GF,
SUM(TotalGA) as GA,
COUNT(IDGame) as GP,
SUM(CASE WHEN PointsAwarded=2 THEN 1 ELSE 0 END) as W,
SUM(CASE WHEN PointsAwarded=1 THEN 1 ELSE 0 END) as O,
SUM(CASE WHEN PointsAwarded=0 THEN 1 ELSE 0 END) as L
from Teams
left join gamesresults on teams.TeamID = gamesresults.idteam
where Teams.TeamcategoryID=1
group by teams.TeamID, teams.TeamName
order by pts desc
当然给了我所有的球队(包括那些还没有参加过比赛的球队),但它会计算每个联赛中的比赛。
关于如何解决这个问题的任何想法?
谢谢!
塞巴斯蒂安
答案 0 :(得分:0)
如果我理解正确,您需要将条件移动到ON子句以保留外连接:
left join gamesresults
on teams.TeamID = gamesresults.idteam
and gameresults.idleague=1;