为什么我得到笛卡尔积而不是加入?

问题描述

| 以下代码应向我返回游戏中前五名玩家的平均成绩。
SELECT \"Starting 5\" as Flag,count(gs.ID) as Games,avg(s.min) as Min,avg(s.P2M) as P2M,avg(s.P2A) as P2A,100*avg(s.P2M/s.P2A) as P2P,avg(s.P3M) as P3M,avg(s.P3A) as P3A,100*avg(s.P3M/s.P3A) as P3P,avg(s.FTM) as FTM,avg(s.FTA) as FTA,100*avg(s.FTM/s.FTA) as FTP,avg(s.OFFENSE) as OFFENSE,avg(s.DEF) as DEF,avg(s.TOT) as TOT,avg(s.AST) as AST,avg(s.TO) as \'TO\',avg(s.ST) as ST,avg(s.FV) as FV,avg(s.CM) as CM,avg(s.PTS) as PTS,avg(s.P2M - s.P2A + s.P3M - s.P3A + s.FTM - s.FTA + s.TOT + s.AST + s.ST + s.FV + s.PTS - s.TO - s.CM) as EFF  
FROM gamesstats AS gs 
    INNER JOIN gamesstatsplayers as gp ON gs.id=gp.GameStatID 
    INNER JOIN players as p ON gp.PlayerID = p.ID 
    INNER JOIN stats as s ON gp.stat=s.id 
                         WHERE gs.HomeTeamID =\'664\' 
                         and gs.Homescore > gs.Visitorscore 
                         and gp.IsHomePlayer = 1 
                         AND gp.IsFirst5 = 1 
                         AND gs.SeasonStart = \'2010\' 
                         AND gs.LeagueID = \'145\' 
我应该得到4场比赛,每场比赛的平均值。我得到的是游戏中每个玩家的平均水平。那意味着我得到20场比赛,平均每场比赛我想要的1/5。问题是由于某种原因,它使笛卡尔积而不是联接。试图寻找该错误几个小时,但似乎找不到它。 表格说明: gamesstats用于保存每个游戏。 gamesstatsplayers是通过GameStatID连接到游戏的,并负责每个游戏中的每个玩家统计信息。 玩家是所有玩家的表格。 stats是只包含统计信息的表,gamesstats带有指向统计信息的链接,可为您提供游戏中整个团队的统计信息(2个链接一个链接用于主场,一个访问者),gamesstatsplayers链接统计信息可为您提供1场比赛中1位球员的数据。 (这意味着统计数据用于两件事)。     

解决方法

        在不知道架构的情况下,这只是一个猜测,但是如果这是游戏的主键,则可能需要对GameStatID进行分组。     ,        首先,您应该使用WHERE子句:
SELECT \"Starting 5\" as Flag,count(gs.ID) as Games,avg(s.min) as Min,avg(s.P2M) as P2M,avg(s.P2A) as P2A,100*avg(s.P2M/s.P2A) as P2P,avg(s.P3M) as P3M,avg(s.P3A) as P3A,100*avg(s.P3M/s.P3A) as P3P,avg(s.FTM) as FTM,avg(s.FTA) as FTA,100*avg(s.FTM/s.FTA) as FTP,avg(s.OFFENSE) as OFFENSE,avg(s.DEF) as DEF,avg(s.TOT) as TOT,avg(s.AST) as AST,avg(s.TO) as \'TO\',avg(s.ST) as ST,avg(s.FV) as FV,avg(s.CM) as CM,avg(s.PTS) as PTS,avg(s.P2M - s.P2A + s.P3M - s.P3A + s.FTM - s.FTA + s.TOT + s.AST + s.ST + s.FV + s.PTS - s.TO - s.CM) as EFF  
FROM gamesstats AS gs 
    INNER JOIN gamesstatsplayers as gp ON gs.id=gp.GameStatID 
    INNER JOIN players as p ON gp.PlayerID = p.ID 
    INNER JOIN stats as s ON gp.stat=s.id 
    WHERE
     gs.HomeTeamID =\'664\' 
     and gs.HomeScore > gs.VisitorScore 
     and gp.IsHomePlayer = 1 
     AND gp.IsFirst5 = 1 
     AND gs.SeasonStart = \'2010\' 
     AND gs.LeagueID = \'145\'