'e.id'
jest stałą łańcuchową, więc COUNT('e.id')
jest tylko niezręcznym, mylącym sposobem powiedzenia COUNT(*)
.
COUNT(e.id)
, z drugiej strony, zlicza wszystkie wiersze w wyniku, w których e.id IS NOT NULL
- od count()
nie liczy wartości NULL.
Podręcznik dotyczący count()
:
Jak widać, wewnętrznie istnieją nawet dwie oddzielne funkcje. Należy zauważyć, że count(*)
jest nieco szybszy. Więc używaj tego, chyba że potrzebujesz drugi wariant. Powiązane:
Możesz odpowiedzieć:
"Ale e.id
to PRIMARY KEY
z core_employments
, więc jest zdefiniowany NOT NULL
!"
Ale to przeoczyłoby warunkowe LEFT JOIN
w zapytaniu, które nadal wprowadza NULL
wartości w Twoim NOT NULL
kolumna, w której warunki sprzężenia nie są spełnione. Powiązane:
To powiedziawszy, LEFT [OUTER] JOIN
również wprowadza w błąd. Warunek późniejszy
having("COUNT(e.id) = 1")
zmusza go do działania jak zwykły [INNER] JOIN
. Po naprawieniu możesz równie dobrze uprościć:
having("COUNT(*) = 1")
A jeśli zależy Ci tylko na tym przynajmniej jeden powiązany wiersz istnieje w core_employments
, tłumacząc na having("COUNT(*) >= 1")
, lepszą (wyraźniejszą, szybszą) techniką w prostych przypadkach będzie EXISTS
półzłącze
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)