ホームページ >データベース >mysql チュートリアル >左外部結合が 30 行ではなく 2 行しか返さないのはなぜですか?
左外部結合のトラブルシューティング: 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 サイトの他の関連記事を参照してください。