'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>)