了解左外連接中缺少的行
嘗試計算每日頁面瀏覽量的使用者遇到了一個常見的左外連線陷阱:左表中缺少行。 此查詢旨在使用左外連接組合 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
不為 10 的行,即使這些行源自左表 (day
)。 左外連接旨在包含左表中的所有行,而不管右表中的匹配情況。 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中文網其他相關文章!