如何通过SQL查询医生总预约时长并按降序展示?
解决方案:查询医生总预约时长并排序
没问题,我来帮你搞定这个SQL查询需求。结合你给出的三张表结构,我们需要关联表并计算每位医生的有效预约总时长,具体实现如下:
最终SQL查询语句
SELECT d.id AS doctor_id, d.doctor_name, COALESCE(SUM(s.duration), 0) AS total_appointment_duration FROM doctors d LEFT JOIN appointments a ON d.id = a.doctor_id AND a.deleted_at IS NULL LEFT JOIN slots s ON a.slot_id = s.id WHERE d.status = 1 -- 如需包含所有状态的医生,可删除此行 GROUP BY d.id, d.doctor_name ORDER BY total_appointment_duration DESC;
代码细节解释
- 表关联逻辑:使用
LEFT JOIN关联三张表,确保即使医生没有任何有效预约,也能出现在结果列表中;通过a.deleted_at IS NULL过滤掉已标记删除的预约记录。 - 总时长计算:用
SUM(s.duration)累加对应医生所有有效预约的时长,COALESCE函数用来处理无预约医生的空值,将其转为0,避免结果出现NULL。 - 筛选与分组:
WHERE d.status = 1用来只统计状态为启用的医生(如果不需要这个条件,直接删除该行即可);GROUP BY按医生的id和姓名分组,确保每个医生只返回一条汇总记录。 - 排序规则:
ORDER BY total_appointment_duration DESC让结果按总预约时长从高到低排列。
针对测试数据的执行结果
如果保留d.status = 1的条件,执行后会得到如下结果:
| doctor_id | doctor_name | total_appointment_duration |
|---|---|---|
| 22 | Khaled | 2700 |
| 23 | Hasan | 1300 |
如果去掉d.status = 1,则会加入医生Rumi,总时长为500。
内容的提问来源于stack exchange,提问作者Shibbir
相关产品推荐
相关产品推荐

