'e.id'
är en strängkonstant, så COUNT('e.id')
är bara ett besvärligt, missvisande sätt att säga COUNT(*)
.
COUNT(e.id)
, å andra sidan, räknar alla rader i resultatet där e.id IS NOT NULL
- sedan count()
räknar inte NULL-värden.
Som du kan se finns det till och med två separata funktioner internt. Och det bör noteras att count(*)
är något snabbare. Så använd det om du inte behöver den andra varianten. Relaterat:
Du kan kontra med:
"Men e.id
är PRIMARY KEY
av core_employments
, så det är definierat NOT NULL
!"
Men det skulle förbise den villkorliga LEFT JOIN
i din fråga som fortfarande introducerar NULL
värden i din NOT NULL
kolumn, där anslutningsvillkoren inte är uppfyllda. Relaterat:
Som sagt, LEFT [OUTER] JOIN
är också vilseledande. Det senare villkoret
having("COUNT(e.id) = 1")
tvingar den att fungera som en vanlig [INNER] JOIN
. När du har fixat det kan du lika gärna förenkla till:
having("COUNT(*) = 1")
Och om allt du bryr dig är att åtminstone en relaterad rad finns i core_employments
, översatt till having("COUNT(*) >= 1")
, skulle den överlägsna (tydligare, snabbare) tekniken i enkla fall vara en EXISTS
semi-join
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)