'e.id'
je řetězcová konstanta, takže COUNT('e.id')
je jen nepříjemný, zavádějící způsob vyjádření COUNT(*)
.
COUNT(e.id)
, na druhou stranu počítá všechny řádky ve výsledku, kde e.id IS NOT NULL
- od count()
nepočítá hodnoty NULL.
Jak vidíte, interně existují dokonce dvě samostatné funkce. A je třeba poznamenat, že count(*)
je o něco rychlejší. Takže to používejte, pokud to nepotřebujete druhá varianta. Související:
Můžete oponovat:
"Ale e.id
." je PRIMARY KEY
z core_employments
, takže je definováno NOT NULL
!"
To by ale přehlédlo podmíněné LEFT JOIN
ve vašem dotazu, který stále zavádí NULL
hodnoty ve vašem NOT NULL
sloupec, kde nejsou splněny podmínky spojení. Související:
To znamená LEFT [OUTER] JOIN
je také zavádějící. Pozdější podmínka
having("COUNT(e.id) = 1")
nutí jej, aby se choval jako prostý [INNER] JOIN
. Jakmile to opravíte, můžete to také zjednodušit na:
having("COUNT(*) = 1")
A pokud vás zajímá jen to aspoň v core_employments
existuje jeden související řádek , v překladu having("COUNT(*) >= 1")
, lepší (jasnější, rychlejší) technika by v jednoduchých případech byla EXISTS
poloviční spojení
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)