MySQL的左连接丢失的结果

问题描述:

我想看看我是否有一些未使用的SIP号码,所以我有号码的列表在表tmp_numbersMySQL的左连接丢失的结果

0203XXXXX00 
0203XXXXX01 
0203XXXXX02 
0203XXXXX03 
... 

我使用的查询是:

SELECT 
n.number, 
COUNT(c.did) AS count 

FROM tmp_numbers n 

LEFT JOIN cdr c 
ON n.number = c.did 

WHERE c.calldate >= '2017-01-01' 

GROUP BY n.number 
ORDER BY n.number 

我从上述查询中得到结果,但省略了它在c.did上无法匹配的数字。

我的印象是一个LEFT JOIN将匹配在/显示在左表(tmp_numbers)的一切,无论是否有在右边的值(所以它会显示NULL?)

我是什么在这里失踪?

where条件置于left join中。否则,它变成隐入inner join,因为在所有的数据where条款过滤器,如果calldate条件为NULL,则条件为FALSE

LEFT JOIN cdr c ON n.number = c.did 
       AND c.calldate >= '2017-01-01' 

您从JOINED表,如果有可能null查询在列

WHERE c.calldate >= '2017-01-01'

:没有相应的条目,所以从改变 WHERE条件

WHERE c.calldate >= '2017-01-01' OR c.did IS NULL