首頁 >資料庫 >mysql教程 >為什麼我的左外連接結果缺少行?

為什麼我的左外連接結果缺少行?

Linda Hamilton
Linda Hamilton原創
2025-01-23 16:13:13919瀏覽

Why are Rows Missing from My Left Outer Join Result?

了解左外連接中缺少的行

嘗試計算每日頁面瀏覽量的使用者遇到了一個常見的左外連線陷阱:左表中缺少行。 此查詢旨在使用左外連接組合 daytracking 表中的資料:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn