Mysql 左外连接不';是否无法返回左表中的所有行?

Mysql 左外连接不';是否无法返回左表中的所有行?,mysql,sql,date,left-join,Mysql,Sql,Date,Left Join,我尝试使用以下查询获取每天打开的页面数 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 我得到的结果是: days opens 1 9 9 2 问题是,在我的day表中,我有一个单独的列,其中包含数字1到30,

我尝试使用以下查询获取每天打开的页面数

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
我得到的结果是:

days opens
1   9
9   2
问题是,在我的day表中,我有一个单独的列,其中包含数字1到30,表示一个月中的天数。我做了一个左外连接,我希望有所有的天显示在天栏

但我的问题是,为什么会这样


感谢所有人的帮助。

您指定连接的tracking.open\u id必须为10。对于其他行,它将为空,因此它们不会显示

指定连接的tracking.open\u id必须为10。对于其他行,它将为空,因此它们不会显示

given解释了为什么没有得到所需的结果(WHERE子句删除了行),但没有解释如何修复它

解决方案是更改连接的位置,使条件成为连接条件的一部分,而不是连接后应用的筛选器:

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
现在,左表中的所有行都将出现在结果中。

given解释了为什么没有得到所需的结果(WHERE子句删除了行),但没有解释如何修复它

解决方案是更改连接的位置,使条件成为连接条件的一部分,而不是连接后应用的筛选器:

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

现在,左表中的所有行都将出现在结果中。

条件在
WHERE
子句中。加入表后,将计算WHERE条件以筛选出所有与条件匹配的内容。因此,任何与tracking.open_id=10不匹配的内容都将被丢弃


如果要在联接两个表时应用此条件,更好的方法是将其与
ON
子句(即联接条件)一起使用,而不是与整个数据集条件一起使用。

该条件位于
WHERE
子句中。加入表后,将计算WHERE条件以筛选出所有与条件匹配的内容。因此,任何与tracking.open_id=10不匹配的内容都将被丢弃


如果要在连接两个表时应用此条件,更好的方法是将其与
ON
子句(即连接条件)一起使用,而不是与整个数据集条件一起使用。

或者,where子句可以更改为
where(tracking.open\u id为NULL或tracking.open\u id=10)
尽管我更喜欢像mark那样将谓词放在join子句中,因为我觉得这样做最有意义。@chris:当连接失败时,这可以工作,但在连接成功但连接行有
跟踪的情况下,这不起作用。open_id
等于10以外的值。在这种情况下,该行仍将被删除。或者,where子句可以更改为
where(tracking.open\u id为NULL或tracking.open\u id=10)
,尽管我更喜欢像mark那样将谓词放在join子句中,因为我觉得这样做最有意义。@chris:当连接失败时,这会起作用,但在加入成功但加入行具有
跟踪的情况下不起作用。open_id
等于10以外的值。在这种情况下,该行仍将被删除。@Nanne我认为你是不可理解的+1重要的,以防人们像我一样,不滚动经过已接受的答案,下面的回答有一个更好的解释,并显示了如何获得OP的期望结果以及如何修复问题problem@Nanne我认为你是不可理解的+1重要的,以防人们像我一样,没有滚动过公认的答案,下面的回答给出了更好的解释,并说明了如何获得OP的期望结果以及如何解决问题。这是否回答了您的问题?这回答了你的问题吗?