ホームページ > データベース > mysql チュートリアル > 左外部結合が左テーブルのすべての行を返さないのはなぜですか?

左外部結合が左テーブルのすべての行を返さないのはなぜですか?

Patricia Arquette
リリース: 2025-01-23 15:51:10
オリジナル
617 人が閲覧しました

Why Doesn't My Left Outer Join Return All Rows from the Left Table?

左外部結合: 左テーブルからの完全なデータ取得を保証する

左外部結合に関するよくある誤解は、左外部結合が常に左のテーブルからすべての行を返すということです。 これは常に真実であるとは限りません。結合条件に基づいて右側のテーブルに一致する行が存在しない場合、左側のテーブルの行は省略されます。

これを例で説明しましょう。 特定のユーザー (open_id) の毎日のページビューをカウントするように設計されたクエリを想像してください:

<code class="language-sql">SELECT day.days, COUNT(*) AS views
FROM day
LEFT OUTER JOIN tracking
ON day.days = DAY(FROM_UNIXTIME(open_date))
WHERE tracking.open_id = 10
GROUP BY day.days</code>
ログイン後にコピー

このクエリは、すべての日とそれに関連する閲覧数を表示することを目的としています。 ただし、day に月の毎日のエントリが含まれているが、trackingopen_id = 10 のいくつかの日のエントリが欠けている場合、それらの日は結果に含まれません。

解決策は、WHERE 句の条件を結合の ON 句に組み込むことです。

<code class="language-sql">SELECT day.days, COUNT(tracking.open_date) AS views
FROM day
LEFT OUTER JOIN tracking
ON day.days = DAY(FROM_UNIXTIME(open_date)) AND tracking.open_id = 10
GROUP BY day.days</code>
ログイン後にコピー

tracking.open_id = 10ON 句に移動すると、条件は結合後のフィルターではなく結合自体の一部になります。これにより、day テーブルのすべての行が確実に含まれ、views テーブルに一致するエントリがない日は tracking に 0 が表示されます。 ビュー数を正確に反映するには、COUNT(tracking.open_date) の代わりに COUNT(*) を使用していることに注意してください。 COUNT(*) は、右のテーブルに一致する行がない場合でも日数をカウントします。

以上が左外部結合が左テーブルのすべての行を返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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