Mysql 使用联接查询检索记录

Mysql 使用联接查询检索记录,mysql,sql,Mysql,Sql,我想每天从emp\u info表中检索上一周的数据 所以我用了: SELECT DAYNAME(timestamp), COUNT(*) FROM `emp_info` WHERE DATE(timestamp ) > DATE_SUB(CURDATE( ) , INTERVAL 1 WEEK ) GROUP BY DAYNAME(timestamp); 根据查询,我得到的结果如下: Monday 5 Thursday 7 但是我也希望工作日的结果为0,没有输入任何记录

我想每天从
emp\u info
表中检索上一周的数据

所以我用了:

SELECT DAYNAME(timestamp), COUNT(*) 
FROM `emp_info` 
WHERE DATE(timestamp ) > DATE_SUB(CURDATE( ) , INTERVAL 1 WEEK ) 
GROUP BY DAYNAME(timestamp);
根据查询,我得到的结果如下:

Monday    5
Thursday  7
但是我也希望工作日的结果0,没有输入任何记录


通过建议,我了解了加入查询。因此,我尝试修复它,但没有得到任何解决方案。

您得到的结果是正确的,因为在特定的dayname上没有记录。因为您想要获得所有的日名,所以需要投影一组完整的日(在子查询中使用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

您得到的结果是正确的,因为在特定的dayname上没有记录。因为您想要获得所有的日名,所以需要投影一组完整的日(在子查询中使用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

谢谢,这对我很有用。但是,如果我使用上一个查询,是否有办法强制填写缺失天数的“0”?我问这个问题是因为如果我要获取一个月的数据,我的查询将成为一篇文章。谢谢,这对我很有用。但是,如果我使用上一个查询,是否有办法强制填写缺失天数的“0”?我这样问是因为如果我要获取一个月的数据,我的查询将成为一篇文章。