如何在COUNT个结果中包含o值? SQL查询

时间:2019-09-10 08:41:29

标签: mysql sql

我需要计算守门员的停工时间。我有两个表(“玩家”和“游戏状态”)。当守门员“穿衣”(有游戏)时,守门员在“ goalsagainst”列中没有“ 0” /零值时,获取值存在问题。 因此,当“ dressed”列的值为1作为“ shutout”列时,我需要计算“ goalsagainst”列中的所有零值。如果“ goalsagains”列中的值大于0,则“ shutout” colmn值应为0;

我尝试了类似主题的其他解决方案,但是我总是有相同的结果,只计算零值而未显示其他值。

My structure:
players
|p_id|pos|
--------
| 1 | G |
--------
| 2 | D |
--------
| 3 | O |
--------
| 4 | G |

stats
|g_id|p_id|goalsagainst|dressed|
--------------------------------
|  1 |  1 |    2       |  1    |
--------------------------------
|  1 |  4 |    0       |  0    |
--------------------------------
|  1 |  3 |    NULL    |  1    |
--------------------------------
|  1 |  2 |    NULL    |  1    |
--------------------------------
|  2 |  1 |    0       |  0    |
--------------------------------
|  2 |  4 |    0       |  1    |
--------------------------------
|  2 |  3 |    NULL    |  1    |
--------------------------------
|  2 |  2 |    NULL    |  1    |
   SELECT 
      stats.id,
      COUNT(stats.goalsagainst) AS shutouts 
   FROM `stats` 
      RIGHT JOIN players 
      ON stats.id = players.id
   WHERE goalsagainst = 0 
      AND players.pos = 'G' 
      AND stats.dressed = 1 
      GROUP BY stats.id;

my result is:

p_id|shutouts
-------------
 4  |    1    

when it should be:

p_id|shutouts
-------------
 1  |    0    
-------------
 4  |    1

1 个答案:

答案 0 :(得分:2)

您的问题是您在stats子句中WHERE表上的条件实际上将RIGHT JOIN变成了INNER JOIN。要解决此问题,请将条件移至ON子句。其次,您需要在players.p_idSELECT中使用GROUP BY,因为stats.p_id可能是NULL

SELECT players.p_id,
       COUNT(stats.goalsagainst) AS shutouts 
FROM `stats` 
RIGHT JOIN players ON stats.p_id = players.p_id AND stats.dressed = 1 AND stats.goalsagainst = 0 
WHERE players.pos = 'G' 
GROUP BY players.p_id;

输出:

p_id    shutouts
1       0
4       1

Demo on dbfiddle