'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>)