首页 >数据库 >mysql教程 >为什么我的左外连接结果中缺少行?

为什么我的左外连接结果中缺少行?

Linda Hamilton
Linda Hamilton原创
2025-01-23 16:13:13921浏览

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