左外连接:确保从左表检索完整的数据
左外连接的一个常见误解是它们总是返回左表中的所有行。 这并不总是正确的。如果根据连接条件右表中不存在匹配行,则左表中的行将被忽略。
让我们用一个例子来说明这一点。 想象一个旨在计算特定用户 (open_id) 每日页面浏览量的查询:
<code class="language-sql">SELECT day.days, COUNT(*) AS views 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
包含该月每一天的条目,但 tracking
缺少 open_id = 10
某些天的条目,则这些天将不会出现在结果中。
解决方案在于将 WHERE
子句条件合并到连接的 ON
子句中:
<code class="language-sql">SELECT day.days, COUNT(tracking.open_date) AS views 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
子句,条件将成为连接本身的一部分,而不是连接后过滤器。这可确保包含 day
表中的所有行,其中 views
显示 0,表示 tracking
表中没有匹配条目的天数。 注意使用 COUNT(tracking.open_date)
而不是 COUNT(*)
来准确反映浏览量;即使右表中没有匹配的行,COUNT(*)
仍然会计算天数。
以上是为什么我的左外连接不返回左表中的所有行?的详细内容。更多信息请关注PHP中文网其他相关文章!