Mysql计数组和左连接不按预期工作

时间:2011-09-13 11:13:39

标签: mysql group-by left-join

以下是点击跟踪器的简单查询。我看了很多其他帖子,我正在摸不着头脑。我无法使此查询生效,以便显示日历表中的所有行(每行一个日历日):

SELECT DATE_FORMAT(calendar_date, '%a %D') AS calendar_date, 
count( tracker_id ) as clicks
FROM calendar
LEFT JOIN offer_tracker USING(calendar_id)
WHERE 
  calendar_month = Month(CURDATE()) AND 
  calendar_year = Year(CURDATE()) AND ( offer_id = 4 OR offer_id IS NULL )
GROUP BY calendar_date;

它几乎就在那里,但并不是所有日历表中的行都被返回,即没有星期五,星期二,星期三,星期三等等:

result set

有没有人对我出错的地方有任何想法?我应该使用子查询吗?

1 个答案:

答案 0 :(得分:4)

我猜offer_id来自offer_tracker表。当你有一个(左)外连接,并且在WHERE条件下使用右表中的字段(比如offer_id = 4)时,实际上会取消连接并提供与内连接相同的结果。

取消取消(offer_id = 4 OR offer_id IS NULL)的尝试并不像您预期​​的那样有效。来自offer_tracker offer_id <> 4的任何行已经通过LEFT JOIN,但由于WHERE条件而被删除。因此,如果此日期的Friday 2nd行与offer_id不同,则结果中不会显示4行。


offer_id = 4支票移至LEFT JOIN,而不是:

SELECT DATE_FORMAT(calendar_date, '%a %D') AS calendar_date
     , count( tracker_id ) as clicks
FROM calendar
  LEFT JOIN offer_tracker 
    ON  offer_tracker.calendar_id = calendar.calendar_id
    AND offer_id = 4
WHERE calendar_month = Month(CURDATE())
  AND calendar_year = Year(CURDATE()) 
GROUP BY calendar_date