【问题标题】:Group by day with filled gaps按天分组,填补空白
【发布时间】:2013-12-11 09:09:27
【问题描述】:

我正在尝试根据本教程Using MySQL to generate daily sales reports with filled gaps 为特定用户生成每日销售报告。 为此,我有三个表,记录表用户表日历表

records     user      calendar
id          id        datefield
user_id     
timestamp

当某一天的数据不可用时,下面的查询返回 0 作为总数,返回 NULL 作为 user_id,这很好:

SELECT calendar.datefield AS DATE,
       IFNULL(COUNT(records.id),0) AS total, records.user_id
FROM records 
RIGHT JOIN calendar ON (DATE(records.timestamp) = calendar.datefield)    

WHERE ( 
    calendar.datefield BETWEEN (NOW() - INTERVAL 14 DAY) AND NOW()
)
GROUP BY DATE DESC

我们的想法是为特定用户生成此报告,因此我将上述查询修改为以下内容:

SELECT calendar.datefield AS DATE,
           IFNULL(COUNT(records.id),0) AS total, records.user_id
    FROM records 
    RIGHT JOIN calendar ON (DATE(records.timestamp) = calendar.datefield)

    WHERE ( 
        calendar.datefield BETWEEN (NOW() - INTERVAL 14 DAY) AND NOW()
        AND records.user_id = SOME_EXISTING_USER_ID
    )
    GROUP BY DATE DESC

当没有记录时返回一个空结果,但其想法是为没有数据的任何特定日期返回 0。

如何修改第一个查询以适用于特定用户?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    哇。自从我在野外看到RIGHT JOIN 以来已经有一段时间了!无论如何,尝试将WHERE 子句中的用户谓词添加到RIGHT JOIN 中,如下所示:

    SELECT calendar.datefield AS DATE,
               IFNULL(COUNT(records.id),0) AS total, records.user_id
        FROM records 
        RIGHT JOIN calendar ON (DATE(records.timestamp) = calendar.datefield) 
                            AND records.user_id = SOME_EXISTING_USER_ID
    
        WHERE ( 
            calendar.datefield BETWEEN (NOW() - INTERVAL 14 DAY) AND NOW()
        )
        GROUP BY DATE DESC;
    

    对我来说,这是显式连接与隐式连接的最大好处之一......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      • 2011-03-07
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多