ホームページ >データベース >mysql チュートリアル >左外部結合が 30 行ではなく 2 行しか返さないのはなぜですか?

左外部結合が 30 行ではなく 2 行しか返さないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-23 16:02:11921ブラウズ

Why Does My Left Outer Join Only Return Two Rows Instead of Thirty?

左外部結合のトラブルシューティング: 2 行のみが返される理由

ユーザーが左外部結合を使用して毎日のページビューをカウントしようとしましたが、クエリは予想外に 30 行ではなく 2 行しか返しませんでした。 問題のあるクエリとその解決策を調べてみましょう。

元のクエリ:

<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>

問題: JOIN の後の WHERE 句

問題は WHERE tracking.open_id = 10 節にあります。 この条件は、左外部結合のに適用されます。 左外部結合は、右側のテーブル (day) に一致するものがない場合でも、左側のテーブル (tracking) のすべての行を含めるように設計されています。ただし、WHERE 句は、tracking.open_id が 10 ではない行を効果的にフィルターで除外するため、day に対応するエントリが tracking にない行を open_id = 10 テーブルから削除します。

解決策: 条件を JOIN に統合する

day テーブルから 30 行すべてを取得するには、フィルタリング条件が結合条件自体の一部である必要があります。 これは、AND:

を使用して実現されます。
<code class="language-sql">SELECT day.days, COUNT(tracking.open_id) 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>

COUNT(tracking.open_id) への変更に注意してください。これにより、tracking に一致するエントリがない日のカウントは NULL ではなく 0 になります。これにより、一部のデータベース システムで問題が発生します。 この修正されたクエリは、左外部結合を正しく実行し、予想される 30 行を返し、毎日のページのオープンを正確に表します。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。