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