Mysql 使用左外部联接未找到记录时,返回0且不为NULL

Mysql 使用左外部联接未找到记录时,返回0且不为NULL,mysql,join,count,outer-join,Mysql,Join,Count,Outer Join,我有两张桌子。我的查询应返回以下内容: AUT | 0 但它不会返回任何东西。尝试了以下操作,但没有任何效果 选择substr(s.initial_group_code,1,3)作为ko_tun,ifnull(count(s.id),0) 来自研究所 左外连接毕业状态g在g上学习权利id=s.id 其中,g.毕业状态日期介于str_和_日期之间('2017年1月1日','%d.%m.%Y') 截止日期('2017年1月31日','%d.%m.%Y') 和substr(s.初始组代码,1,3)

我有两张桌子。我的查询应返回以下内容:

AUT  | 0
但它不会返回任何东西。尝试了以下操作,但没有任何效果

选择substr(s.initial_group_code,1,3)作为ko_tun,ifnull(count(s.id),0)
来自研究所
左外连接毕业状态g在g上学习权利id=s.id
其中,g.毕业状态日期介于str_和_日期之间('2017年1月1日','%d.%m.%Y')
截止日期('2017年1月31日','%d.%m.%Y')
和substr(s.初始组代码,1,3)=‘AUT’
按子序列分组(s.初始分组编码,1,3);
选择substr(s.initial_group_code,1,3)作为ko_tun,count(s.id)+0
来自研究所
左外连接毕业状态g在g上学习权利id=s.id
其中,g.毕业状态日期介于str_和_日期之间('2017年1月1日','%d.%m.%Y')
截止日期('2017年1月31日','%d.%m.%Y')
和substr(s.初始组代码,1,3)=‘AUT’
按子序列分组(s.初始分组编码,1,3);
选择substr(s.initial_group_code,1,3)作为ko_tun,COALESCE(count(s.id),0)
来自研究所
左外连接毕业状态g在g上学习权利id=s.id
其中substr(s.初始组代码,1,3)=‘AUT’
以及str_至_日期之间的毕业状态_日期('2017年1月1日','%d.%m.%Y')
截止日期('2017年1月31日','%d.%m.%Y')
按子序列分组(s.初始分组编码,1,3);

一般来说,由于您的代码相当混乱:

SELECT
    TblA.column1,
    TblA.column2,
    TblB.column3
FROM
    a AS TblA
LEFT JOIN
    b AS TblB
    ON TblA.column4 = TblB.column4
如果表未联接(或
column3
中的值为
NULL
),则
column3
将导致
NULL

因此,您可以添加
IF
语句来更改:

SELECT
    TblA.column1,
    TblA.column2,
    IF(TblB.column3 IS NULL, 0, TblB.column3) AS column3
FROM
    a AS TblA
LEFT JOIN
    b AS TblB
    ON TblA.column4 = TblB.column4

这表示“如果column3为null,则将其设置为0,否则,返回列值。”

您需要将外部表上的筛选条件从联接的
WHERE
子句移动到
on
子句。否则,您将隐式转换为
内部联接

像这样的东西应该适合你:

select substr(s.initial_group_code,1,3) as ko_tun, 
  count(g.study_entitlement_id)
from study_entitlement s
left outer join graduation_status g on g.study_entitlement_id = s.id 
  and g.graduation_status_date between str_to_date('01.01.2017', '%d.%m.%Y') 
    and str_to_date('31.01.2017', '%d.%m.%Y')
where substr(s.initial_group_code,1,3) = 'AUT'
group by substr(s.initial_group_code,1,3);

请使用编辑器格式化您的代码,以便更容易区分哪个是哪个。您确定数据集中确实存在组
AUT
?您可能需要在这里使用日历表。我看不出这里有什么问题,因为您选择的两列都在基表中,而不是外部联接表中。什么都没用是什么意思?我假设这三个查询都是对同一代码的不同尝试?非常感谢Ike Walker。实际上,我在on-子句的开头有过滤条件,但没有注意到我计算了错误的列。所以再次感谢:)