以下是点击跟踪器的简单查询。我看了很多其他帖子,我正在摸不着头脑。我无法使此查询生效,以便显示日历表中的所有行(每行一个日历日):
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;
它几乎就在那里,但并不是所有日历表中的行都被返回,即没有星期五,星期二,星期三,星期三等等:
有没有人对我出错的地方有任何想法?我应该使用子查询吗?
答案 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