Вернуть 0 и не NULL, если запись не найдена с помощью левого внешнего соединения

У меня есть две таблицы. Мой запрос должен вернуть следующее:

AUT  | 0

но это ничего не возвращает. Попробовал следующее ниже, но ничего не работает.

select substr(s.initial_group_code,1,3) as ko_tun, ifnull(count(s.id),0) 
from study_entitlement s
left outer join graduation_status g on g.study_entitlement_id = s.id
where g.graduation_status_date between str_to_date('01.01.2017', '%d.%m.%Y') 
  and str_to_date('31.01.2017', '%d.%m.%Y')
and substr(s.initial_group_code,1,3) = 'AUT'
group by substr(s.initial_group_code,1,3);
select substr(s.initial_group_code,1,3) as ko_tun, count(s.id)+0 
from study_entitlement s
left outer join graduation_status g on g.study_entitlement_id = s.id
where g.graduation_status_date between str_to_date('01.01.2017', '%d.%m.%Y') 
  and str_to_date('31.01.2017', '%d.%m.%Y')
and substr(s.initial_group_code,1,3) = 'AUT'
group by substr(s.initial_group_code,1,3);
select substr(s.initial_group_code,1,3) as ko_tun, COALESCE(count(s.id),0) 
from study_entitlement s
left outer join graduation_status g on g.study_entitlement_id = s.id 
where substr(s.initial_group_code,1,3) = 'AUT'
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')
group by substr(s.initial_group_code,1,3);

2 ответа

В общем, поскольку ваш код довольно грязный:

SELECT
    TblA.column1,
    TblA.column2,
    TblB.column3
FROM
    a AS TblA
LEFT JOIN
    b AS TblB
    ON TblA.column4 = TblB.column4

Приведет к NULL за column3 где таблицы не объединяются (или значение в 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 является нулем, то установите его в 0, в противном случае, верните значение столбца".

Вам нужно переместить критерии фильтрации на внешнюю таблицу из WHERE пункт к ON пункт о соединении. В противном случае вы неявно преобразуете в INNER JOIN,

Нечто подобное должно работать для вас:

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);
Другие вопросы по тегам