2013-05-30 98 views
1

我想每天从emp_info表中检索最近1周的数据。使用JOIN查询检索记录

所以我用:

SELECT DAYNAME(timestamp), COUNT(*) 
FROM `emp_info` 
WHERE DATE(timestamp) > DATE_SUB(CURDATE() , INTERVAL 1 WEEK) 
GROUP BY DAYNAME(timestamp); 

据我得到的结果类似查询:

Monday 5 
Thursday 7 

但我也希望结果平日的为上没有记录已输入。

从建议我知道了关于JOIN查询。所以我试图解决它,但没有得到任何解决方案。

回答

4

你得到的结果是正确的,因为在特定的日期名称上没有记录。由于您想要获取所有日期名称,因此需要投影一整天(,在SUBQUERY内使用UNION),并将其与现有查询结合使用。

SELECT a.day_name, 
     COALESCE(b.totalCount, 0) totalCount 
FROM 
     (
      SELECT 'Sunday' day_name, 1 ordby UNION ALL 
      SELECT 'Monday' day_name, 2 ordby UNION ALL 
      SELECT 'Tuesday' day_name, 3 ordby UNION ALL 
      SELECT 'Wednesday' day_name, 4 ordby UNION ALL 
      SELECT 'Thursday' day_name, 5 ordby UNION ALL 
      SELECT 'Friday' day_name, 6 ordby UNION ALL 
      SELECT 'Saturday' day_name, 7 ordby 
     ) a 
     LEFT JOIN 
     (
      SELECT DAYNAME(timestamp) day_name, 
        COUNT(*) totalCount 
      FROM `emp_info` 
      WHERE DATE(timestamp) > DATE_SUB(CURDATE() , INTERVAL 1 WEEK) 
      GROUP BY DAYNAME(timestamp) 
     ) b ON a.day_name = b.day_name 
ORDER BY a.ordby 
+1

感谢,这对我的作品。但是,如果我使用以前的查询,是否有办法强制填写“0”以填补缺失的日期?我问这个问题,因为如果我要把这些数据存储一个月,我的查询将成为一篇文章。 – Sam

+0

不客气':)' –