'e.id'
is een stringconstante, dus COUNT('e.id')
is gewoon een ongemakkelijke, misleidende manier om COUNT(*)
. te zeggen .
COUNT(e.id)
, aan de andere kant, telt alle rijen in het resultaat waar e.id IS NOT NULL
- sinds count()
telt geen NULL-waarden.
Zoals je kunt zien, zijn er intern zelfs twee afzonderlijke functies. En er moet worden opgemerkt dat count(*)
gaat iets sneller. Dus gebruik dat tenzij je nodig de tweede variant. Gerelateerd:
U kunt tegengaan met:
"Maar e.id
is de PRIMARY KEY
van core_employments
, dus het is gedefinieerd NOT NULL
!"
Maar dat zou voorbij gaan aan de voorwaardelijke LEFT JOIN
in uw zoekopdracht die nog steeds NULL
. introduceert waarden in uw NOT NULL
kolom, waar niet aan de voorwaarden voor samenvoegen wordt voldaan. Gerelateerd:
Dat gezegd hebbende, LEFT [OUTER] JOIN
is ook misleidend. De latere toestand
having("COUNT(e.id) = 1")
dwingt het om zich te gedragen als een eenvoudige [INNER] JOIN
. Als je dat eenmaal hebt opgelost, kun je het net zo goed vereenvoudigen tot:
having("COUNT(*) = 1")
En als het je alleen maar uitmaakt dat tenminste er bestaat één gerelateerde rij in core_employments
, vertaald naar having("COUNT(*) >= 1")
, zou de superieure (duidelijkere, snellere) techniek in eenvoudige gevallen een EXISTS
semi-join
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)