LEFT JOIN を使用する場合の一般的な問題は、特定のグループに対してゼロのカウントが返されないことです。 これは、フィルター条件が JOIN 句ではなく WHERE 句に配置されている場合によく発生します。 この例では、LEFT JOIN を正しく構成して、カウントがゼロの組織も含めてすべての組織が確実に含まれるようにする方法を示します。
この問題は、WHERE 句の配置が間違っていることが原因で発生します。 次の修正されたクエリを考えてみましょう:
<code class="language-sql">LEFT JOIN exam_items e ON e.organisation_id = o.id AND e.item_template_id = #{sanitize(item_template_id)} AND e.used</code>
JOIN 句内にフィルター条件 (e.item_template_id
、e.used
) を配置すると、一致する行のみが結合されます。 以前は、これらの条件を WHERE 句に配置すると、誤って LEFT JOIN が INNER JOIN に変換され、エントリが一致しない組織が除外されました。
NULL を返す他の集計関数とは異なり、COUNT(*)
と COUNT(e.id)
は常に数値 (0 以上) を返すことを理解することが重要です。 したがって、この場合、NULL 値を処理するために COALESCE
を使用する必要はありません。
exam_items
行の大部分がカウントされるシナリオの場合、カウントを事前に集計することでパフォーマンスが向上します。
<code class="language-sql">LEFT JOIN ( SELECT organisation_id AS id -- aliased for simpler join , COUNT(*) AS total_used -- COUNT(*) is generally faster FROM exam_items WHERE item_template_id = #{sanitize(item_template_id)} AND used GROUP BY 1 ) e USING (id)</code>
この最適化されたアプローチでは、まず exam_items
からのカウントを集計し、次に組織テーブルとのより単純な結合を実行します。これにより、特に大規模なデータセットの場合、クエリ速度が大幅に向上します。
以上がLEFT JOIN が組織に対してゼロのカウントを返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。