代码之家  ›  专栏  ›  技术社区  ›  Justin

如何在SQL语句中联接第三个表,该表返回一个COUNT而不丢失0 COUNT项?

  •  0
  • Justin  · 技术社区  · 15 年前

    这个问题的继续 I need a SQL statement that returns the number rows in a table with a specific value.

    我们结束了一个SQL语句,如下所示。。。

       SELECT t.teamid,
              t.teamname,
              COALESCE(COUNT(p.playerid), 0) AS playercount,
              t.rosterspots
         FROM TEAMS t
    LEFT JOIN PLAYERS p ON p.teamid = t.teamid
     GROUP BY t.teamid, t.teamname, t.rosterspots
    

    我还有一个限制要补充。如果玩家在计算“玩家计数”之前需要通过体检怎么办?

    MedicalTests
    PlayerId  PassedMedical
    1         1
    2         0
    3         1
    4         1
    

    其中“PassedMedical”是位(1=真)。

    并向Teams表中再添加一行数据。

    TeamId    Team Name
    3         Toronto Rapters
    

    这样我就有了一支0人的队伍。

    Team Name         PlayerCount
    Miami Heat        2
    New York Knicks   1
    Toronto Rapters   0
    

    因为迈阿密热火队的一名球员还没有通过体检。

    如果我加上

    LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId
    WHERE m.PassedMedical = 1
    

    对于上面的语句,我丢失了所有“0”行?


    贾斯廷

    4 回复  |  直到 8 年前
        1
  •  1
  •   David    15 年前

    如果我误解了这个问题,请原谅我,但我认为没有必要在球员桌上加入左路。我们只需要球员的数量。为什么不这样做:

    SELECT t.teamid,
              t.teamname, 
              (SELECT COUNT(*) FROM players inner join medicaltests on players.playerid = medicaltests.playerid where players.teamid = t.teamid and medicaltests.passedmedical = 1) AS playercount,
              t.rosterspots
         FROM TEAMS t
     GROUP BY t.teamid, t.teamname, t.rosterspots
    
        2
  •  2
  •   ysth    15 年前
    LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId
    WHERE m.PassedMedical = 1
    

    这是自相矛盾的。您的意思是它是一个左连接,因此MEDICALTESTS记录不需要存在,但是您的意思是该记录实际上必须存在,并且有一个1作为PassedMedical。所以你的左连接实际上变成了一个内部连接,同样的,因为你必须有一个MEDICALTESTS行,你也必须有一个PLAYERS行,所以这也变成了一个内部连接。

    请尝试以下操作:

    INNER JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId and m.PassedMedical = 1
    

    如果不起作用,请改用subselect;不要连接,只需添加:

    WHERE p.PlayerId IS NULL or (select PassedMedical from MEDICALTESTS m where m.PlayerId=p.PlayerID) = 1 
    

        3
  •  1
  •   Yves M.    15 年前

    SELECT
        t.teamid, 
        t.teamname,
        (SELECT COUNT(*) FROM MEDICALTESTS m WHERE p.PlayerId = m.PlayerId and m.PassedMedical = 1 ) AS PassedMedicalCount
    
        4
  •  1
  •   HLGEM    15 年前

    http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN

    基本上,通过将条件放在where类中,可以将左连接转换为内连接。请尝试以下操作:

    LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId 
    and m.PassedMedical = 1 
    
    推荐文章