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

LEFT JOIN クエリがカウント 0 の組織を返さないのはなぜですか?

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

Why Doesn't My LEFT JOIN Query Return Organizations with a Count of Zero?

PostgreSQL LEFT JOIN: ゼロカウント組織の問題への対処

PostgreSQL で LEFT JOIN を使用する場合の一般的な課題には、関連するレコードの数を取得することが含まれます。 特定の組織のカウントがゼロの場合、その組織は結果から除外される可能性があります。 この記事では、この問題について説明します。

次のクエリは、組織ごとに使用済みアイテムをカウントしようとします:

<code class="language-sql">SELECT o.name as organisation_name,
         coalesce(COUNT(exam_items.id)) as total_used
  FROM organisations o
  LEFT JOIN exam_items e on o.id = e.organisation_id
  WHERE e.item_template_id = #{sanitize(item_template_id)}
  and e.used = true
  GROUP BY o.name
  ORDER BY o.name</code>
ログイン後にコピー

このクエリの欠陥は WHERE 句にあります。 WHERE 句内に配置された条件は、結合のをフィルタリングし、LEFT JOIN で一致するレコードが見つからない場合に INNER JOINexam_items に効果的に変換します。

改善されたバージョンは次のとおりです:

解決策 1: JOIN 条件を修正する

WHERE 句は、カウントがゼロの組織を除外します。 item_template_id 条件と used 条件を ONLEFT JOIN 句に移動すると、これは解決されます。

<code class="language-sql">SELECT o.name AS organisation_name, COUNT(e.id) AS total_used
FROM organisations o
LEFT JOIN exam_items e ON e.organisation_id = o.id AND e.item_template_id = #{sanitize(item_template_id)} AND e.used
GROUP BY o.name
ORDER BY o.name;</code>
ログイン後にコピー

この改訂されたクエリにより、exam_items に一致するエントリがない組織も含めて、すべての組織が確実に含まれるようになります。

解決策 2: 効率化のための事前集計

大規模なデータセットの場合、exam_items を事前に集計すると、パフォーマンスが大幅に向上します。

<code class="language-sql">SELECT o.id, o.name AS organisation_name, COALESCE(e.total_used, 0) AS total_used
FROM organisations o
LEFT JOIN (
   SELECT organisation_id AS id, COUNT(*) AS total_used
   FROM exam_items
   WHERE item_template_id = #{sanitize(item_template_id)} AND used = TRUE
   GROUP BY 1
) e ON o.id = e.id
ORDER BY o.name, o.id;</code>
ログイン後にコピー

このアプローチでは、最初に各組織の数を集計してから LEFT JOIN を実行するため、クエリがより効率的になります。 COALESCE が NULL の場合を処理するために total_used を使用することに注意してください。

これらのソリューションのいずれかを実装すると、カウントがゼロの組織も含め、すべての組織の使用済みアイテムの数を正確に取得できます。 データ サイズとパフォーマンス要件に最適なソリューションを選択してください。

以上がLEFT JOIN クエリがカウント 0 の組織を返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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