'e.id' は文字列定数なので、COUNT('e.id') COUNT(*)の言い方は厄介で誤解を招くだけです。 。
COUNT(e.id) 一方、e.id IS NOT NULLである結果のすべての行をカウントします -count()以降 NULL値はカウントされません。
ご覧のとおり、内部には2つの別個の関数もあります。また、count(*) 少し速いです。したがって、必要でない限り、これを使用してください。 2番目のバリアント。関連:
次のように反論するかもしれません:
"しかし、e.id PRIMARY KEYです。 core_employmentsの 、したがって、NOT NULLと定義されています !"
しかし、それは条件付きLEFT JOINを見落とします。 それでもNULLを導入するクエリで NOT NULLの値 結合条件が満たされていない列。関連:
そうは言っても、LEFT [OUTER] JOIN 誤解を招くこともあります。後の状態
having("COUNT(e.id) = 1")
プレーンな[INNER] JOINのように動作するように強制します 。これを修正したら、次のように簡略化することをお勧めします。
having("COUNT(*) = 1")
そして、あなたが気にするのがそれだけなら少なくとも 1つの関連する行がcore_employmentsに存在します 、having("COUNT(*) >= 1")に変換します 、単純な場合の優れた(より明確で高速な)手法は、 EXISTS セミジョイン
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)