'e.id'
es una constante de cadena, por lo que COUNT('e.id')
es solo una forma incómoda y engañosa de decir COUNT(*)
.
COUNT(e.id)
, por otro lado, cuenta todas las filas en el resultado donde e.id IS NOT NULL
- desde count()
no cuenta valores NULOS.
Como puede ver, hay incluso dos funciones separadas internamente. Y cabe señalar que count(*)
es un poco más rápido. Así que úsalo a menos que necesites la segunda variante. Relacionado:
Puede responder con:
"Pero e.id
es la PRIMARY KEY
de core_employments
, por lo que se define NOT NULL
!"
Pero eso pasaría por alto el condicional LEFT JOIN
en su consulta que aún presenta NULL
valores en su NOT NULL
columna, donde no se cumplen las condiciones de unión. Relacionado:
Dicho esto, LEFT [OUTER] JOIN
también es engañoso. La última condición
having("COUNT(e.id) = 1")
lo obliga a actuar como un simple [INNER] JOIN
. Una vez que haya solucionado eso, también podría simplificar a:
having("COUNT(*) = 1")
Y si todo lo que te importa es eso al menos existe una fila relacionada en core_employments
, que se traduce como having("COUNT(*) >= 1")
, la técnica superior (más clara, más rápida) en casos simples sería EXISTS
semi-unirse
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)