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