2011-09-13 105 views
2

下面是一个简单的点击跟踪器查询。我看了很多其他的帖子,我正在挠头。我不能让这个查询工作,以便从日历表中的所有行(每行一个日历日)显示:Mysql计数分组和左连接不按预期工作

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; 

它几乎存在,但不是在日历表中的所有行返回即不存在星期五2,周二6日,7日星期三等:

result set

没有人有我要去哪里不对任何想法?我应该使用子查询吗?

+0

可能是LEFT JOIN的情况下,一些行在CALENDAR_ID NULL值 – medopal

+0

你好medopal,在offer_tracker表CALENDAR_ID被设置为不NULL,我无法在calendar_id中找到任何空行,但感谢将它标记为建议。 – Studio4

+0

该查询无误。当没有地方引用'Fri 2nd'时,Mysql无法返回结果。一个示例解决方案将如http://stackoverflow.com/questions/7386530/return-multiple-copies-slightly-modified/7387014#7387014 – ajreal

回答

4

我猜offer_id来自offer_tracker表。如果您有一个(左)外连接,并且您在WHERE条件(如offer_id = 4)中使用右表中的一个字段,则连接实际上会被取消,并且会得到与内连接相同的结果。

试图解除取消(offer_id = 4 OR offer_id IS NULL)不能按预期工作。 offer_trackeroffer_id <> 4之间的任何行都已经通过了LEFT JOIN,但由于WHERE条件而被删除。因此,如果offer_id与该日期的4不同,那么结果中将不会出现Friday 2nd的行。


移动的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 
+0

ypercube,你是一个天才。感谢您的帮助和全面的答复。 – Studio4