'e.id' é uma constante de string, então COUNT('e.id') é apenas uma maneira estranha e enganosa de dizer COUNT(*) . COUNT(e.id) , por outro lado, conta todas as linhas no resultado onde e.id IS NOT NULL - desde count() não conta valores NULL. O manual sobre
count() :
Como você pode ver, existem até duas funções separadas internamente. E deve-se notar que
count(*) é um pouco mais rápido. Então use isso a menos que você precisa a segunda variante. Relacionado:Você pode responder com:
"Mas
e.id é a PRIMARY KEY de core_employments , então é definido NOT NULL !" Mas isso ignoraria o condicional
LEFT JOIN em sua consulta que ainda apresenta NULL valores em seu NOT NULL coluna, onde as condições de junção não são atendidas. Relacionado:Dito isso,
LEFT [OUTER] JOIN também é enganoso. A condição posterior having("COUNT(e.id) = 1")
força-o a agir como um simples
[INNER] JOIN . Depois de corrigir isso, você também pode simplificar para:having("COUNT(*) = 1")
E se tudo o que importa é que pelo menos existe uma linha relacionada em
core_employments , traduzindo para having("COUNT(*) >= 1") , a técnica superior (mais clara, mais rápida) em casos simples seria uma EXISTS semi-juntar
:WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)