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的期望结果以及如何解决问题这是否回答了你的问题?