'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>)