You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:45:05