求符合要求的SQL查询语句:统计用户已审批未删除服务日志总时长
正确SQL查询语句实现
表结构
users id bigint first_name varchar(255) last_name varchar(255) email varchar(255) service_events id bigint name varchar(255) service_logs id bigint approved tinyint user_id bigint(fk:users) service_event_id bigint(fk:service_events) deleted_at datetime(nullable) service_log_days id bigint service_log_id bigint(fk:service_logs) total_hours double
注:修正了原表结构中sevice_log_id的拼写错误,应为service_log_id以匹配外键关联
需求
返回包含用户信息及已审批、未删除服务日志总时长的表:
- 需返回所有用户记录,无论是否有符合条件的服务日志
- 无符合条件日志的用户,时长值为
0 - 每位用户仅对应一行记录
示例输出
first_name last_name email total_hours Student One one@email.com 0 Student Two two@email.com 135
正确查询语句
SELECT u.first_name, u.last_name, u.email, COALESCE(SUM(sld.total_hours), 0) AS total_hours FROM users u LEFT JOIN service_logs sl ON u.id = sl.user_id AND sl.approved = 1 AND sl.deleted_at IS NULL LEFT JOIN service_log_days sld ON sl.id = sld.service_log_id GROUP BY u.id, u.first_name, u.last_name, u.email;
语句说明
- 用
LEFT JOIN关联users与service_logs,确保所有用户都被保留,同时在关联条件中直接过滤出**已审批(approved=1)、未删除(deleted_at IS NULL)**的日志 - 再通过
LEFT JOIN关联service_log_days,获取对应时长记录 - 用
SUM(sld.total_hours)计算总时长,配合COALESCE将无符合条件日志时的NULL值转为0 - 通过
GROUP BY按用户唯一标识及信息字段分组,保证每位用户仅返回一行记录
内容的提问来源于stack exchange,提问作者user3229397
相关产品推荐
相关产品推荐

