下面是一个简单的点击跟踪器查询。我看了很多其他的帖子,都抓狂了。我无法使此查询工作,以便显示日历表中的所有行(每行一个日历日):

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等:
有人知道我错在哪里吗?我应该使用子查询吗?

最佳答案

我想offer_id来自offer_tracker表。当您有一个(左)外部联接,并且您在WHERE条件下使用右表中的一个字段(如您的offer_id = 4)时,联接实际上被取消,并给出与内部联接相同的结果。
取消取消(offer_id = 4 OR offer_id IS NULL)的尝试无法按预期工作。offer_tracker中带有offer_id <> 4的任何行都已通过左联接,但由于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

关于mysql - MySQL计数组由和左联接无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7400920/

10-15 10:49