'e.id'
ist eine String-Konstante, also COUNT('e.id')
ist nur eine umständliche, irreführende Art, COUNT(*)
zu sagen .
COUNT(e.id)
hingegen zählt alle Zeilen im Ergebnis, in denen e.id IS NOT NULL
ist - seit count()
zählt keine NULL-Werte.
Wie Sie sehen können, gibt es intern sogar zwei getrennte Funktionen. Und es sollte beachtet werden, dass count(*)
ist etwas schneller. Verwenden Sie das also, es sei denn, Sie brauchen die zweite Variante. Verwandte:
Sie könnten kontern mit:
"Aber e.id
ist der PRIMARY KEY
von core_employments
, also ist es definiert NOT NULL
!"
Aber das würde den bedingten LEFT JOIN
übersehen in Ihrer Abfrage, die immer noch NULL
einführt Werte in Ihrem NOT NULL
Spalte, in der die Join-Bedingungen nicht erfüllt sind. Verwandte:
Das heißt, LEFT [OUTER] JOIN
ist auch irreführend. Die spätere Bedingung
having("COUNT(e.id) = 1")
zwingt es, sich wie ein einfacher [INNER] JOIN
zu verhalten . Sobald Sie das behoben haben, können Sie genauso gut vereinfachen zu:
having("COUNT(*) = 1")
Und wenn Sie sich nur darum kümmern, zumindest eine zugehörige Zeile existiert in core_employments
, übersetzt in having("COUNT(*) >= 1")
, wäre die überlegene (klarere, schnellere) Technik in einfachen Fällen ein EXISTS
Semi-Join
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)