'e.id'
est une constante de chaîne, donc COUNT('e.id')
est juste une façon maladroite et trompeuse de dire COUNT(*)
.
COUNT(e.id)
, d'autre part, compte toutes les lignes du résultat où e.id IS NOT NULL
- depuis count()
ne compte pas les valeurs NULL.
Comme vous pouvez le constater, il existe même deux fonctions distinctes en interne. Et il convient de noter que count(*)
est légèrement plus rapide. Alors utilisez-le sauf si vous en avez besoin la deuxième variante. Connexe :
Vous pourriez contrer avec :
"Mais e.id
est la PRIMARY KEY
de core_employments
, il est donc défini NOT NULL
!"
Mais cela négligerait le conditionnel LEFT JOIN
dans votre requête qui introduit toujours NULL
valeurs dans votre NOT NULL
colonne, où les conditions de jointure ne sont pas remplies. Connexe :
Cela dit, LEFT [OUTER] JOIN
est trompeur aussi. La dernière condition
having("COUNT(e.id) = 1")
le force à agir comme un simple [INNER] JOIN
. Une fois que vous avez corrigé cela, autant simplifier :
having("COUNT(*) = 1")
Et si tout ce qui vous importe, c'est que au moins une ligne associée existe dans core_employments
, se traduisant par having("COUNT(*) >= 1")
, la technique supérieure (plus claire, plus rapide) dans les cas simples serait un EXISTS
semi-jointure
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)