左外連線故障排除:為何只回傳兩行
使用者嘗試使用左外連線計算每日頁面瀏覽量,但查詢意外地只傳回兩行,而不是預期的三十行。 讓我們檢查一下有問題的查詢及其解決方案。
原始查詢:
<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
中沒有符合條目的日期計數為 0,而不是 NULL,否則會導致某些資料庫系統出現問題。 此更正後的查詢正確執行左外連線並傳回預期的 30 行,準確表示每日頁面開啟。
以上是為什麼我的左外連線只回兩行而不是三十行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!