'e.id' er en strengkonstant, så COUNT('e.id') er bare en akavet, vildledende måde at sige COUNT(*) på .
COUNT(e.id) tæller på den anden side alle rækker i resultatet, hvor e.id IS NOT NULL - siden count() tæller ikke NULL-værdier.
Som du kan se, er der endda to separate funktioner internt. Og det skal bemærkes, at count(*) er lidt hurtigere. Så brug det, medmindre du bruger den anden variant. Relateret:
Du kan imødegå med:
"Men e.id er den PRIMARY KEY af core_employments , så det er defineret NOT NULL !"
Men det ville overse den betingede LEFT JOIN i din forespørgsel, der stadig introducerer NULL værdier i din NOT NULL kolonne, hvor sammenføjningsbetingelserne ikke er opfyldt. Relateret:
Når det er sagt, LEFT [OUTER] JOIN er også vildledende. Den senere betingelse
having("COUNT(e.id) = 1")
tvinger den til at fungere som en almindelig [INNER] JOIN . Når du har rettet det, kan du lige så godt forenkle til:
having("COUNT(*) = 1")
Og hvis du bare bekymrer dig mindst en relateret række findes i core_employments , oversat til having("COUNT(*) >= 1") , ville den overlegne (klare, hurtigere) teknik i simple tilfælde være en EXISTS semi-join
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)