'e.id'
è una costante stringa, quindi COUNT('e.id')
è solo un modo goffo e fuorviante per dire COUNT(*)
.
COUNT(e.id)
, d'altra parte, conta tutte le righe nel risultato in cui e.id IS NOT NULL
- poiché count()
non conta i valori NULL.
Come puoi vedere, ci sono anche due funzioni separate internamente. E va notato che count(*)
è leggermente più veloce. Quindi usalo a meno che tu non ne abbia necessità la seconda variante. Correlati:
Potresti rispondere con:
"Ma e.id
è la PRIMARY KEY
di core_employments
, quindi è definito NOT NULL
!"
Ma ciò trascurerebbe il condizionale LEFT JOIN
nella tua query che introduce ancora NULL
valori nel tuo NOT NULL
colonna, dove le condizioni di unione non sono soddisfatte. Correlati:
Detto questo, LEFT [OUTER] JOIN
è anche fuorviante. La condizione successiva
having("COUNT(e.id) = 1")
lo costringe ad agire come un semplice [INNER] JOIN
. Una volta risolto il problema, potresti anche semplificare in:
having("COUNT(*) = 1")
E se tutto ciò che ti interessa è che almeno esiste una riga correlata in core_employments
, traducendo in having("COUNT(*) >= 1")
, la tecnica superiore (più chiara, più veloce) nei casi semplici sarebbe un EXISTS
semi-unirsi
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)