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

如何用带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_outlets CTE只执行一次,后续的计数查询都基于这个结果,减少了重复的表扫描
  • 逻辑和方案一完全一致,只是写法更简洁高效

内容的提问来源于stack exchange,提问作者phani kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:53:54