了解左外连接中缺失的行
尝试计算每日页面浏览量的用户遇到了一个常见的左外连接陷阱:左表中缺少行。 该查询旨在使用左外连接组合 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中文网其他相关文章!