ホームページ >データベース >mysql チュートリアル >左外部結合の結果から行が欠落しているのはなぜですか?
左外部結合で欠落している行について
毎日のページビューを計算しようとしているユーザーは、左側のテーブルから行が欠落しているというよくある左外部結合の落とし穴に遭遇しました。 このクエリは、左外部結合を使用して day
テーブルと tracking
テーブルのデータを結合することを目的としていました:
<code class="language-sql">SELECT day.days, COUNT(*) as opens 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
テーブルには 1 日から 30 日までのデータが含まれていましたが、結果には 1 日と 9 日のみが表示されました。この不一致は、WHERE
句の配置から発生します。
問題: WHERE 句の配置が正しくありません
WHERE tracking.open_id = 10
句は結合の後をフィルタリングします。これは、たとえそれらの行が左側 (tracking.open_id
) テーブルからのものであっても、day
が 10 ではない行を削除することを意味します。 左外部結合は、右側のテーブルの一致に関係なく、左側のテーブルのすべての行を含めるように設計されています。 WHERE
句は、この動作を事実上無効にします。
解決策: フィルタを JOIN 条件に統合する
day
テーブルからすべての日を正しく取得するには、フィルタリング条件を JOIN
条件自体に統合する必要があります。
<code class="language-sql">SELECT day.days, COUNT(*) as opens 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
句に移動すると、行が結合される前にフィルタリングが行われます。 これにより、結合時に tracking
テーブル (open_id = 10
の場合) の一致する行のみが考慮され、最終結果では day
テーブルのすべての行が保持されます。 これは、左外部結合の意図を正確に反映しています。
以上が左外部結合の結果から行が欠落しているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。