Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 左外连接不';是否无法返回左表中的所有行?_Mysql_Sql_Date_Left Join - Fatal编程技术网

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。对于其他行,它将为空,因此它们不会显示

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