左外部結合: 左テーブルからの完全なデータ取得を保証する
左外部結合に関するよくある誤解は、左外部結合が常に左のテーブルからすべての行を返すということです。 これは常に真実であるとは限りません。結合条件に基づいて右側のテーブルに一致する行が存在しない場合、左側のテーブルの行は省略されます。
これを例で説明しましょう。 特定のユーザー (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
に月の毎日のエントリが含まれているが、tracking
に open_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 = 10
を ON
句に移動すると、条件は結合後のフィルターではなく結合自体の一部になります。これにより、day
テーブルのすべての行が確実に含まれ、views
テーブルに一致するエントリがない日は tracking
に 0 が表示されます。 ビュー数を正確に反映するには、COUNT(tracking.open_date)
の代わりに COUNT(*)
を使用していることに注意してください。 COUNT(*)
は、右のテーブルに一致する行がない場合でも日数をカウントします。
以上が左外部結合が左テーブルのすべての行を返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。