【问题标题】:Mysql count group by and left join not working as expectedMysql count group by 和 left join 没有按预期工作
【发布时间】:2011-09-13 11:13:39
【问题描述】:

以下是点击跟踪广告的简单查询。我看过很多其他帖子,我正在摸不着头脑。我无法让这个查询工作,以便显示日历表中的所有行(每行一个日历日):

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 日等:

有人知道我哪里出错了吗?我应该使用子查询吗?

【问题讨论】:

  • 可能是 LEFT JOIN,以防某些行在 calendar_id 中有 NULL 值
  • 您好 medopal,offer_tracker 表中的 calendar_id 设置为 NOT NULL,我在 calendar_id 中找不到任何带有 null 的行,但感谢您将其标记为建议。
  • 查询正确。没有地方可以参考Fri 2nd时mysql无法返回结果。一个示例解决方案类似于stackoverflow.com/questions/7386530/…

标签: mysql group-by left-join


【解决方案1】:

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

取消取消的尝试 (offer_id = 4 OR offer_id IS NULL) 未按预期进行。 offer_trackeroffer_id <> 4 中的任何行都已经通过了 LEFT JOIN 但由于 WHERE 条件而被删除。因此,如果在此日期有 offer_id4 不同的行,则结果中不会出现 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

【讨论】:

  • ypercube,你是个天才。感谢您的帮助和全面的回答。
猜你喜欢
  • 2020-05-17
  • 1970-01-01
  • 2011-06-02
  • 2020-01-08
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
相关资源
最近更新 更多