Вы используете LEFT JOIN для опционально таблица соответствия вторичной таблицы call_out_end
.Если совпадений нет, вы все равно хотите отобразить записи из первичной таблицы user
.
Проблема с вашим запросом состоит в том, что ваше предложение WHERE
ссылается на поле из вторичной таблицы (callstart
),Следовательно, когда LEFT JOIN
не совпадает, callstart
в предложении WHERE
появляется NULL
, в результате чего соответствующая запись отфильтровывается.
Для решения проблемы необходимо переместитьфильтр в этом поле от предложения WHERE
до ON
части LEFT JOIN
.
select user.*, count(call_out_end.id) as calls
from user
left join call_out_end
on call_out_end.employer_id = user.id
and call_out_end.callstart >= '2018-12-09 00:00:00'
where user.id = 949
group by user.id
Концептуально это тот же запрос, что и гораздо более уродливый:
select user.*, count(call_out_end.id) as calls
from user
left join call_out_end
on call_out_end.employer_id = user.id
where
user.id = 949
and (
call_out_end.employer_id IS NULL
or call_out_end.callstart >= '2018-12-09 00:00:00'
)
group by user.id