ホームページ > データベース > mysql チュートリアル > LEFT JOIN が組織に対してゼロのカウントを返さないのはなぜですか?

LEFT JOIN が組織に対してゼロのカウントを返さないのはなぜですか?

Patricia Arquette
リリース: 2025-01-14 11:14:42
オリジナル
638 人が閲覧しました

Why Doesn't My LEFT JOIN Return Zero Counts for Organizations?

LEFT JOIN クエリのトラブルシューティング: ゼロカウントと最適化

LEFT JOIN を使用する場合の一般的な問題は、特定のグループに対してゼロのカウントが返されないことです。 これは、フィルター条件が JOIN 句ではなく WHERE 句に配置されている場合によく発生します。 この例では、LEFT JOIN を正しく構成して、カウントがゼロの組織も含めてすべての組織が確実に含まれるようにする方法を示します。

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_ide.used) を配置すると、一致する行のみが結合されます。 以前は、これらの条件を WHERE 句に配置すると、誤って LEFT JOIN が INNER JOIN に変換され、エントリが一致しない組織が除外されました。

COUNT(e.id) の動作

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート