左外连接不会返回左表中的所有行?

Abs*_*Abs 11 mysql sql date

我试图使用以下查询每天打开页面数.

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
Run Code Online (Sandbox Code Playgroud)

我得到它的输出是这样的:

days opens
1   9
9   2
Run Code Online (Sandbox Code Playgroud)

问题是,在我的日历表中,我有一个包含数字1到30的列来表示一个月中的日期.我做了一个左外连接,我期待在天柱上显示所有日子!

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

谢谢大家的帮助.

Mar*_*ers 52

Nanne给出的答案解释了为什么没有得到所需的结果(WHERE子句删除行),而不是如何修复它.

解决方案是将WHERE更改为AND,以便条件是连接条件的一部分,而不是在连接后应用的过滤器:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 或者,where 子句可以更改为“WHERE (tracking.open_id IS NULL ortracking.open_id = 10)”,尽管我更喜欢像 mark 那样将谓词放在 join 子句中,因为我觉得在那里最有意义。 (2认同)
  • @chris:当连接失败时有效,但在连接成功但连接行的"tracking.open_id"等于10以外的情况下不起作用.在这种情况下,行仍将被删除. (2认同)

Nan*_*nne 13

您指定连接的tracking.open_id必须为10.对于其他行,它将为NULL,因此它们不会显示!