MySQL统计每位员工各状态预订数,无匹配记录时展示0的实现方法
问题原因
你当前使用的是隐式内连接,仅会返回两张表匹配成功的行,且当员工没有对应状态的预订记录时,统计结果会为NULL而非0,因此不会展示预订数为0的员工。
修正方案
首先注意你原SQL中关联条件写的是booking.ConvenerID,根据你给出的表结构,booking表关联员工的字段为StaffID,如果实际表字段确实为ConvenerID可自行调整。
单参数查询(传入$status统计对应状态数量)
修改后的SQL如下:
SELECT staff.StaffID, staff.First_name, staff.Last_name, COUNT(booking.BookingID) AS status_count FROM staff LEFT JOIN booking ON staff.StaffID = booking.StaffID AND booking.Status = '$status' GROUP BY staff.StaffID, staff.First_name, staff.Last_name
修改点说明
- 替换原来的隐式内连接为
LEFT JOIN左连接,保证员工表的所有记录都会被保留 - 状态筛选条件放到
ON子句中而非WHERE子句:如果放到WHERE子句,左连接生成的空值会被过滤,等同于变回内连接,依然无法返回数量为0的员工 - 使用
COUNT统计booking表的非空主键(BookingID),没有匹配记录时统计结果自动为0,符合需求
扩展:一次性统计两种状态的预订数量
如果不需要动态传参,想要一次查询得到每位员工的已确认、已取消预订数,可使用如下写法:
SELECT staff.StaffID, staff.First_name, staff.Last_name, COUNT(IF(booking.Status = 'confirmed', 1, NULL)) AS confirmed_count, COUNT(IF(booking.Status = 'cancelled', 1, NULL)) AS cancelled_count FROM staff LEFT JOIN booking ON staff.StaffID = booking.StaffID GROUP BY staff.StaffID, staff.First_name, staff.Last_name
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

