我需要计算守门员的停工时间。我有两个表(“玩家”和“游戏状态”)。当守门员“穿衣”(有游戏)时,守门员在“ 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
答案 0 :(得分:2)
您的问题是您在stats
子句中WHERE
表上的条件实际上将RIGHT JOIN
变成了INNER JOIN
。要解决此问题,请将条件移至ON
子句。其次,您需要在players.p_id
和SELECT
中使用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