2013-12-11 39 views
0

我试图根据本教程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。

如何修改为特定用户工作的第一个查询?

回答

3

哇。过了一段时间,因为我已经在野外看到了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; 

对我来说,这是明确的巨大好处之一加入VS隐加入...

+0

我不断地学习。 ..真棒!谢谢 – Lomse