У меня разные результаты из запроса для COUNT ('e.id') или COUNT (e.id)
'e.id'
- строковая константа, поэтому COUNT('e.id')
- это просто неловкий, вводящий в заблуждение способ сказать COUNT(*)
.
COUNT(e.id)
, с другой стороны, считает все строки в результате, где e.id IS NOT NULL
- так как count()
не считает значения NULL.
Мануал о count()
:
count(*)
... количество строк ввода
count(expression)
... количество входных строк, для которых
значение выражения не равно нулю
Как видите, внутри есть даже две отдельные функции. А также
Следует отметить, что count(*)
немного быстрее. Так что используйте это, если вам не нужен второй вариант. Связанный:
Вы можете противостоять:
"Но e.id
- это PRIMARY KEY
из core_employments
, поэтому оно определено NOT NULL
!"
Но это не учитывает условное LEFT JOIN
в вашем запросе, которое все еще вводит значения NULL
в столбце NOT NULL
, где условия соединения не выполняются. Связанный:
Тем не менее, LEFT [OUTER] JOIN
также вводит в заблуждение. Позднее состояние
having("COUNT(e.id) = 1")
заставляет его действовать как равнина [INNER] JOIN
. Как только вы исправите это, вы можете упростить до:
having("COUNT(*) = 1")
И если все, что вас волнует, это то, что по крайней мере одна связанная строка существует в core_employments
, переводя в having("COUNT(*) >= 1")
, превосходную (более четкую, быструю) технику в простых случаях будет EXISTS
полусоединение :
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)