如何用带COUNT的子查询合并同参数user_id的多表计数查询
合并多计数查询为单条带单次参数的查询
没问题,我帮你把这三个查询合并成一条只需要传入一次user_id参数的SQL语句,同时修正了原查询里的逻辑问题(原第二个和第三个查询直接用auditer_id=?并不正确,因为auditer_id关联的是user_outlet的id,不是用户的user_id),还添加了年度匹配避免跨年月统计错误:
方案一:标量子查询(兼容大多数SQL方言)
SELECT -- 第一个查询:统计用户关联的活跃门店总数 (SELECT COUNT(*) FROM `user_outlet` JOIN `outlet` ON `outlet`.`id`=`user_outlet`.`outlet_id` WHERE `user_outlet`.`user_id`=? AND `user_outlet`.`isActive`=TRUE) AS total_outlets, -- 第二个查询:统计当月计划的审核任务数 (SELECT COUNT(*) FROM `audit_schedule` JOIN `user_outlet` ON `user_outlet`.`id`=`audit_schedule`.`auditer_id` WHERE `user_outlet`.`user_id`=? AND MONTH(`audit_schedule`.`schedule_date`)=MONTH(NOW()) AND YEAR(`audit_schedule`.`schedule_date`)=YEAR(NOW())) AS planned_count, -- 第三个查询:统计当月已完成的审核任务数 (SELECT COUNT(*) FROM `audit` JOIN `user_outlet` ON `user_outlet`.`id`=`audit`.`auditor_id` WHERE `user_outlet`.`user_id`=? AND MONTH(`audit`.`created_date`)=MONTH(NOW()) AND YEAR(`audit`.`created_date`)=YEAR(NOW())) AS completed_count;
说明:
- 这条查询通过三个标量子查询分别计算三个计数结果,最终返回一行包含三个字段的记录
- 虽然写了三个
?占位符,但在执行预处理语句时,你只需要传入一次user_id值(大多数数据库驱动会自动将同一个占位符替换为相同参数) - 添加
YEAR()函数是为了避免跨年度的月份匹配问题(比如1月时不会统计去年12月的记录)
方案二:CTE公共表表达式(适合支持CTE的数据库,如MySQL 8+、PostgreSQL等)
如果你的数据库支持CTE,用这种方式可以避免重复查询user_outlet表,性能更优:
WITH user_outlets AS ( -- 先获取当前用户的所有活跃门店ID SELECT id FROM `user_outlet` WHERE user_id=? AND isActive=TRUE ) SELECT -- 统计活跃门店总数 (SELECT COUNT(*) FROM user_outlets) AS total_outlets, -- 统计当月计划任务数 (SELECT COUNT(*) FROM `audit_schedule` WHERE auditer_id IN (SELECT id FROM user_outlets) AND MONTH(schedule_date)=MONTH(NOW()) AND YEAR(schedule_date)=YEAR(NOW())) AS planned_count, -- 统计当月完成任务数 (SELECT COUNT(*) FROM `audit` WHERE auditor_id IN (SELECT id FROM user_outlets) AND MONTH(created_date)=MONTH(NOW()) AND YEAR(created_date)=YEAR(NOW())) AS completed_count;
说明:
user_outletsCTE只执行一次,后续的计数查询都基于这个结果,减少了重复的表扫描- 逻辑和方案一完全一致,只是写法更简洁高效
内容的提问来源于stack exchange,提问作者phani kumar
相关产品推荐
相关产品推荐

