Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 内部联接问题_Mysql_Join_Inner Join - Fatal编程技术网

Mysql 内部联接问题

Mysql 内部联接问题,mysql,join,inner-join,Mysql,Join,Inner Join,我试图使用内部联接将3个表联接在一起,但是结果显示的记录比应该存在的记录要多。我的数据表设置如下: Table:gameday.atbats GameName Inning num b s o Batter Pitcher Result -----------------------------------------------------------------------------------------

我试图使用内部联接将3个表联接在一起,但是结果显示的记录比应该存在的记录要多。我的数据表设置如下:

Table:gameday.atbats

   GameName                     Inning num  b   s   o   Batter   Pitcher      Result
-----------------------------------------------------------------------------------------
    gid_2008_09_24_cinmlb_houmlb_1  1   1   2   3   1   457803  150116  Jay Bruce strikes out swinging.  
    gid_2008_09_24_cinmlb_houmlb_1  1   2   1   0   2   433898  150116  Jeff Keppinger lines out to right fielder Hunter Pence.  
    gid_2008_09_24_cinmlb_houmlb_1  1   3   3   1   2   458015  150116  Joey Votto singles on a line drive to right fielder Hunter Pence.  
    gid_2008_09_24_cinmlb_houmlb_1  1   4   2   3   3   429665  150116  Edwin Encarnacion called out on strikes.  
    gid_2008_09_24_cinmlb_houmlb_1  1   5   1   2   0   430565  459371  Kazuo Matsui singles on a line drive to right fielder Jay Bruce.  
-----------------------------------------------------------------------------------------

Table: Gameday.pitches
 GameName                   GameAtBatID      Result
------------------------------------------------------
gid_2008_09_24_cinmlb_houmlb_1  1       Called Strike
gid_2008_09_24_cinmlb_houmlb_1  1       Ball
gid_2008_09_24_cinmlb_houmlb_1  1       Swinging Strike
gid_2008_09_24_cinmlb_houmlb_1  1       Ball
gid_2008_09_24_cinmlb_houmlb_1  1       Foul
gid_2008_09_24_cinmlb_houmlb_1  1       Foul
gid_2008_09_24_cinmlb_houmlb_1  1       Swinging Strike
gid_2008_09_24_cinmlb_houmlb_1  2       Ball
gid_2008_09_24_cinmlb_houmlb_1  2       In play, out(s)
gid_2008_09_24_cinmlb_houmlb_1  3       Called Strike
gid_2008_09_24_cinmlb_houmlb_1  3       Ball
--------------------------------------------------------

Table:batters
   GameName                     id         name_display_first_last
----------------------------------------------------------------------------------
gid_2008_09_24_cinmlb_houmlb_1  407783      Geoff Geary
gid_2008_09_24_cinmlb_houmlb_1  209315      David Newhan
gid_2008_09_24_cinmlb_houmlb_1  115629      LaTroy Hawkins
gid_2008_09_24_cinmlb_houmlb_1  113889      Darin Erstad
gid_2008_09_24_cinmlb_houmlb_1  457803      Jay Bruce
gid_2008_09_24_cinmlb_houmlb_1  433898      Jeff Keppinger
gid_2008_09_24_cinmlb_houmlb_1  458015      Joey Votto
gid_2008_09_24_cinmlb_houmlb_1  429665      Edwin Encarnacion
---------------------------------------------------------------------------
我正在运行一组相当标准的内部连接,将各个表连接在一起,得到一个输出,逐节显示每个击球手在整个比赛中的表现。我的代码如下:

SELECT 


    gameday.atbats.inning,
    gameday.batters.name_display_first_last,
    gameday.pitches.Result
FROM
 gameday.atbats
        Inner join 
     gameday.pitches on gameday.atbats.num = gameday.pitches.gameAtBatID
        inner join
    gameday.batters on gameday.atbats.batter = gameday.batters.ID

    where gameday.atbats.gamename = "gid_2008_09_24_cinmlb_houmlb_1"

我的问题是,当我运行这个查询时,击球手得到的结果比他们应该得到的多。例如,在第一局,击球手jay Bruce(atbats表中的num 1)应该在第一局向他投出7个球,但当我运行查询时,他将向他投出10个球。为了得到这些结果,我做了哪些不正确的事情。此外,我知道这些字段名的命名非常糟糕,但它们是由其他人命名的,我还没有机会更改它们。

我打赌
atbats.num
pitchs.GameAtBatID
并不是要全局唯一地标识一个at-bat,而是,在给定的游戏中,他们只能唯一地识别一个at-bat。因此,除了将
atbats.GameName
限制为所需的游戏之外,还需要指定
pitchs.GameName=atbats.GameName

SELECT gameday.atbats.inning,
       gameday.batters.name_display_first_last,
       gameday.pitches.Result
  FROM gameday.atbats
  JOIN gameday.pitches
    ON gameday.atbats.GameName = gameday.pitches.GameName
   AND gameday.atbats.num = gameday.pitches.GameAtBatID
  JOIN batters
    ON gameday.atbats.GameName = gameday.batters.GameName
   AND gameday.atbats.batter = gameday.batters.ID
 WHERE gameday.atbats.gamename = 'gid_2008_09_24_cinmlb_houmlb_1'

(注意:我还为
batters
添加了类似的
,因为尽管
batters.ID
的值足够大,似乎这确实是一个独特的字段,但为了一致性,将其包含进来是有意义的。)

我打赌
atbats.num
pitchs.GameAtBatID
并不意味着全局唯一地标识一个at-bat,而是它们只在给定游戏中唯一地标识一个at-bat。因此,除了将
atbats.GameName
限制为所需的游戏之外,还需要指定
pitchs.GameName=atbats.GameName

SELECT gameday.atbats.inning,
       gameday.batters.name_display_first_last,
       gameday.pitches.Result
  FROM gameday.atbats
  JOIN gameday.pitches
    ON gameday.atbats.GameName = gameday.pitches.GameName
   AND gameday.atbats.num = gameday.pitches.GameAtBatID
  JOIN batters
    ON gameday.atbats.GameName = gameday.batters.GameName
   AND gameday.atbats.batter = gameday.batters.ID
 WHERE gameday.atbats.gamename = 'gid_2008_09_24_cinmlb_houmlb_1'

(注意:我还为
batters
添加了类似的
,因为尽管
batters.ID
的值足够大,似乎这确实是一个独特的字段,但为了一致性,将其包含进来是有意义的。)

我打赌
atbats.num
pitchs.GameAtBatID
并不意味着全局唯一地标识一个at-bat,而是它们只在给定游戏中唯一地标识一个at-bat。因此,除了将
atbats.GameName
限制为所需的游戏之外,还需要指定
pitchs.GameName=atbats.GameName

SELECT gameday.atbats.inning,
       gameday.batters.name_display_first_last,
       gameday.pitches.Result
  FROM gameday.atbats
  JOIN gameday.pitches
    ON gameday.atbats.GameName = gameday.pitches.GameName
   AND gameday.atbats.num = gameday.pitches.GameAtBatID
  JOIN batters
    ON gameday.atbats.GameName = gameday.batters.GameName
   AND gameday.atbats.batter = gameday.batters.ID
 WHERE gameday.atbats.gamename = 'gid_2008_09_24_cinmlb_houmlb_1'

(注意:我还为
batters
添加了类似的
,因为尽管
batters.ID
的值足够大,似乎这确实是一个独特的字段,但为了一致性,将其包含进来是有意义的。)

我打赌
atbats.num
pitchs.GameAtBatID
并不意味着全局唯一地标识一个at-bat,而是它们只在给定游戏中唯一地标识一个at-bat。因此,除了将
atbats.GameName
限制为所需的游戏之外,还需要指定
pitchs.GameName=atbats.GameName

SELECT gameday.atbats.inning,
       gameday.batters.name_display_first_last,
       gameday.pitches.Result
  FROM gameday.atbats
  JOIN gameday.pitches
    ON gameday.atbats.GameName = gameday.pitches.GameName
   AND gameday.atbats.num = gameday.pitches.GameAtBatID
  JOIN batters
    ON gameday.atbats.GameName = gameday.batters.GameName
   AND gameday.atbats.batter = gameday.batters.ID
 WHERE gameday.atbats.gamename = 'gid_2008_09_24_cinmlb_houmlb_1'

(注意:我还包括了类似的
用于
batters
,因为尽管
batters.ID
的值足够大,似乎这确实是一个独特的字段,但出于一致性考虑,包含它是有意义的。)

这是真的,因为SQL是自上而下工作的,所以当您连接前两个表时,您将拥有

Inner join 
     gameday.pitches on gameday.atbats.num = gameday.pitches.gameAtBatID
您将获得这些结果

GameName                   GameAtBatID      Result         Batter    
--------------------------------------------------------------------------
gid_2008_09_24_cinmlb_houmlb_1  1       Called Strike      457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Ball               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Swinging Strike    457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Ball               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Foul               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Foul               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Swinging Strike    457803 
gid_2008_09_24_cinmlb_houmlb_1  2       Ball               433898
gid_2008_09_24_cinmlb_houmlb_1  2       In play, out(s)    433898
gid_2008_09_24_cinmlb_houmlb_1  3       Called Strike      458015 
gid_2008_09_24_cinmlb_houmlb_1  3       Ball               458015 
然后,当您添加新的连接行时

inner join
    gameday.batters on gameday.atbats.batter = gameday.batters.ID
您将从三个表中得到这些结果

name_display_first_last   GameAtBatID      Result          Batter    
    --------------------------------------------------------------------------
    Jay Bruce                1       Called Strike      457803 
    Jay Bruce                1       Ball               457803 
    Jay Bruce                1       Swinging Strike    457803 
    Jay Bruce                1       Ball               457803 
    Jay Bruce                1       Foul               457803 
    Jay Bruce                1       Foul               457803 
    Jay Bruce                1       Swinging Strike    457803 
    Jeff Keppinger           2       Ball               433898
    Jeff Keppinger           2       In play, out(s)    433898
    David Newhan             3       Called Strike      458015 
    David Newhan             3       Ball               458015 

这是真的,因为SQL是自上而下工作的,所以当您连接前两个表时,您将拥有

Inner join 
     gameday.pitches on gameday.atbats.num = gameday.pitches.gameAtBatID
您将获得这些结果

GameName                   GameAtBatID      Result         Batter    
--------------------------------------------------------------------------
gid_2008_09_24_cinmlb_houmlb_1  1       Called Strike      457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Ball               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Swinging Strike    457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Ball               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Foul               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Foul               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Swinging Strike    457803 
gid_2008_09_24_cinmlb_houmlb_1  2       Ball               433898
gid_2008_09_24_cinmlb_houmlb_1  2       In play, out(s)    433898
gid_2008_09_24_cinmlb_houmlb_1  3       Called Strike      458015 
gid_2008_09_24_cinmlb_houmlb_1  3       Ball               458015 
然后,当您添加新的连接行时

inner join
    gameday.batters on gameday.atbats.batter = gameday.batters.ID
您将从三个表中得到这些结果

name_display_first_last   GameAtBatID      Result          Batter    
    --------------------------------------------------------------------------
    Jay Bruce                1       Called Strike      457803 
    Jay Bruce                1       Ball               457803 
    Jay Bruce                1       Swinging Strike    457803 
    Jay Bruce                1       Ball               457803 
    Jay Bruce                1       Foul               457803 
    Jay Bruce                1       Foul               457803 
    Jay Bruce                1       Swinging Strike    457803 
    Jeff Keppinger           2       Ball               433898
    Jeff Keppinger           2       In play, out(s)    433898
    David Newhan             3       Called Strike      458015 
    David Newhan             3       Ball               458015 

这是真的,因为SQL是自上而下工作的,所以当您连接前两个表时,您将拥有

Inner join 
     gameday.pitches on gameday.atbats.num = gameday.pitches.gameAtBatID
您将获得这些结果

GameName                   GameAtBatID      Result         Batter    
--------------------------------------------------------------------------
gid_2008_09_24_cinmlb_houmlb_1  1       Called Strike      457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Ball               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Swinging Strike    457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Ball               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Foul               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Foul               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Swinging Strike    457803 
gid_2008_09_24_cinmlb_houmlb_1  2       Ball               433898
gid_2008_09_24_cinmlb_houmlb_1  2       In play, out(s)    433898
gid_2008_09_24_cinmlb_houmlb_1  3       Called Strike      458015 
gid_2008_09_24_cinmlb_houmlb_1  3       Ball               458015 
然后,当您添加新的连接行时

inner join
    gameday.batters on gameday.atbats.batter = gameday.batters.ID
您将从三个表中得到这些结果

name_display_first_last   GameAtBatID      Result          Batter    
    --------------------------------------------------------------------------
    Jay Bruce                1       Called Strike      457803 
    Jay Bruce                1       Ball               457803 
    Jay Bruce                1       Swinging Strike    457803 
    Jay Bruce                1       Ball               457803 
    Jay Bruce                1       Foul               457803 
    Jay Bruce                1       Foul               457803 
    Jay Bruce                1       Swinging Strike    457803 
    Jeff Keppinger           2       Ball               433898
    Jeff Keppinger           2       In play, out(s)    433898
    David Newhan             3       Called Strike      458015 
    David Newhan             3       Ball               458015 

这是真的,因为SQL是自上而下工作的,所以当您连接前两个表时,您将拥有

Inner join 
     gameday.pitches on gameday.atbats.num = gameday.pitches.gameAtBatID
您将获得这些结果

GameName                   GameAtBatID      Result         Batter    
--------------------------------------------------------------------------
gid_2008_09_24_cinmlb_houmlb_1  1       Called Strike      457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Ball               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Swinging Strike    457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Ball               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Foul               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Foul               457803 
gid_2008_09_24_cinmlb_houmlb_1  1       Swinging Strike    457803 
gid_2008_09_24_cinmlb_houmlb_1  2       Ball               433898
gid_2008_09_24_cinmlb_houmlb_1  2       In play, out(s)    433898
gid_2008_09_24_cinmlb_houmlb_1  3       Called Strike      458015 
gid_2008_09_24_cinmlb_houmlb_1  3       Ball               458015 
然后,当您添加新的连接行时

inner join
    gameday.batters on gameday.atbats.batter = gameday.batters.ID
您将从三个表中得到这些结果

name_display_first_last   GameAtBatID      Result          Batter    
    --------------------------------------------------------------------------
    Jay Bruce                1       Called Strike      457803 
    Jay Bruce                1       Ball               457803 
    Jay Bruce                1       Swinging Strike    457803 
    Jay Bruce                1       Ball               457803 
    Jay Bruce                1       Foul               457803 
    Jay Bruce                1       Foul               457803 
    Jay Bruce                1       Swinging Strike    457803 
    Jeff Keppinger           2       Ball               433898
    Jeff Keppinger           2       In play, out(s)    433898
    David Newhan             3       Called Strike      458015 
    David Newhan             3       Ball               458015