一条sql查询多个表的统计数据

环境:Mysql+Mybatis
需求:每个省份单独有一张表,每个表统计“待提交”、“待审核"、"已通过"和”总条数“信息。一条sql解决,不用传统方式循环查询上百次,从而提高查询效率和减轻数据库压力。

dao-impl:

@Override
			public List<Map<String, Object>> getCountByBathSql(List<Users> userList) {
				if(userList != null && userList.size() > 0) {
					return getReadSqlSession().selectList("suidaoxinxicaijiDao.getCountByBathSql",userList);
				}else {
					return null;
				}
			}

参数 userList:sql需要使用List中每个Users对象的id和省份名称provinceName,其中Users对象为省厅用户,id为每个省份分表的标识符,用于确定表名,provinceName在统计结果中返回,用于前台显示

mybatis:

  <!-- 批量查询符合条件的数量 -->
			<select id="getCountByBathSql"  parameterType="java.util.List" resultType="map">
				select t.* from 
				 <foreach collection="list" index="index" item="user" open="(" separator="UNION" close=")">
					  select
						sum(case when zhuangtai = 0 then 1 else 0 end) count1 ,<!-- 待提交 -->
						sum(case when zhuangtai in (1,2,3,4) then 1 else 0 end) count2 ,<!-- 待审核 -->
						sum(case when zhuangtai = 5 then 1 else 0 end) count3,<!-- 通过 -->
								count(*) count4,
						#{user.provinceName} provinceName,  <!-- 返回当前数据所属省份,前台显示 -->
						#{user.id} userId			<!-- 用户分表的标识符 -->
						from suidaoxinxicaiji_#{user.id}       
				</foreach>  t
			</select>

简化的案例sql:

select t.* from (
							 select
									sum(case when zhuangtai = 0 then 1 else 0 end) count1 ,
									sum(case when zhuangtai in (1,2,3,4) then 1 else 0 end) count2 ,
									sum(case when zhuangtai = 5 then 1 else 0 end) count3,
											count(*) count4
									from suidaoxinxicaiji_789
								UNION
								select
									sum(case when zhuangtai = 0 then 1 else 0 end) count1 ,
									sum(case when zhuangtai in (1,2,3,4) then 1 else 0 end) count2 ,
									sum(case when zhuangtai = 5 then 1 else 0 end) count3,
											count(*) count4
									from suidaoxinxicaiji_828 
			) t

查询结果:
在这里插入图片描述

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值