ホームページ > データベース > mysql チュートリアル > 左外部結合の結果から行が欠落しているのはなぜですか?

左外部結合の結果から行が欠落しているのはなぜですか?

Linda Hamilton
リリース: 2025-01-23 16:13:13
オリジナル
925 人が閲覧しました

Why are Rows Missing from My Left Outer Join Result?

左外部結合で欠落している行について

毎日のページビューを計算しようとしているユーザーは、左側のテーブルから行が欠落しているというよくある左外部結合の落とし穴に遭遇しました。 このクエリは、左外部結合を使用して 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 = 10ON 句に移動すると、行が結合されるにフィルタリングが行われます。 これにより、結合時に tracking テーブル (open_id = 10 の場合) の一致する行のみが考慮され、最終結果では day テーブルのすべての行が保持されます。 これは、左外部結合の意図を正確に反映しています。

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

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