'e.id'
е низова константа, така че COUNT('e.id')
е просто неудобен, подвеждащ начин да се каже COUNT(*)
.
COUNT(e.id)
, от друга страна, брои всички редове в резултата, където e.id IS NOT NULL
- от count()
не отчита NULL стойности.
Както можете да видите, има дори две отделни функции вътрешно. И трябва да се отбележи, че 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>)