2011-09-13 98 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