MySQL查询优化:合并同日期同员工记录并汇总工时(近7天区间)
优化后的MySQL查询方案
我来帮你搞定这个查询的两个核心需求——合并重复记录并汇总工时,同时修正日期查询范围,直接上调整后的SQL代码:
SELECT s.id, s.staff_name, pw.added_by as staff_id, pw.date, SUM(pw.hours) as total_hours, MAX(pw.id) as worklog_id FROM staffs as s LEFT JOIN project_worklogs pw ON pw.added_by = s.id WHERE pw.date BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE() GROUP BY s.id, s.staff_name, pw.added_by, pw.date -- 可选:如果不需要显示无工时记录的员工,取消下面一行的注释 -- HAVING total_hours IS NOT NULL
关键修改点拆解:
- 合并重复记录与汇总工时:
用SUM(pw.hours)计算同一员工(staff_id)同一天(date)的总工时,配合GROUP BY子句按员工ID、姓名、日期分组,确保每个员工每天仅返回一条记录。如果需要保留某一条具体的worklog_id,用MAX(pw.id)或MIN(pw.id)选取即可,按需调整。 - 修正日期查询范围:
把原语句中“日期晚于7天前”的逻辑,改成BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE(),这样精准覆盖近7天的完整区间(包含7天前当天和今天)。同时直接用日期类型比较,比转成字符串更高效,也避免了格式不匹配导致的查询错误。 - 可选的空记录过滤:
如果不需要显示没有工时记录的员工,可以取消HAVING total_hours IS NOT NULL的注释,或者直接把LEFT JOIN改成INNER JOIN,这样只会返回有对应工时数据的员工。
内容的提问来源于stack exchange,提问作者Nisar Khalid
相关产品推荐
相关产品推荐

