MySQL查询问题:如何统计员工状态为ended的预约总时长?
解决方案
你只需要对时长求和部分增加状态过滤条件即可,修改后的查询语句如下:
$status = "cancelled"; // 注意:如果booking表中关联员工的字段实际为你代码里写的convenerID就保留,否则替换为你表结构里的StaffID $query1 = "SELECT staff.StaffID, CONCAT(staff.First_name, ' ', staff.Last_name) AS StaffName, COALESCE(SUM(IF(booking.Status = 'ended', booking.duration, 0)), 0) AS `MeetingHours(min)`, COALESCE(SUM(booking.Status = '$status'), 0) AS `No. of cancelled meeting` FROM staff LEFT JOIN booking ON staff.StaffID = booking.StaffID GROUP BY staff.StaffID";
修改说明
- 核心调整是将原来直接求和所有时长的
sum(booking.duration)替换为带条件判断的求和逻辑:SUM(IF(booking.Status = 'ended', booking.duration, 0)),只有状态为ended的预约才会累加时长,其余状态的预约时长记为0,满足你只统计已结束预约总时长的需求,外层加COALESCE是为了处理员工没有任何预约的情况,返回0而非NULL。 - 新增
CONCAT(staff.First_name, ' ', staff.Last_name) AS StaffName直接拼接得到员工完整姓名,符合你返回结果的字段要求。 - 请注意关联条件的字段一致性:你提供的booking表结构中关联员工的字段为
StaffID,如果原代码中的convenerID是笔误,请替换为StaffID。
按照你提供的样例数据,修改后返回结果如下:
| StaffID | StaffName | MeetingHours(min) | No. of cancelled meeting |
|---|---|---|---|
| 1 | John Doe | 30 | 1 |
| 2 | Mary Doe | 0 | 1 |
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

