时间:2023-03-11来源:系统城装机大师作者:佚名
最近遇到一个统计查询需求,要求一次性查询多个统计信息,其中两个查询信息不在一个表中,也没有业务关联,表中也没有做连接处理。不考虑产品设计是否合理,完全是实际需求如此,需要一次性查询出来返回给前端进行展示,对于这种“非常规”的统计查询平常肯定会遇见,感觉有点代表性,所以简单记录一下。希望对有相同需求的同学可以作为参考。
简单交代一下业务场景,为方便理解,对业务需求做了简化处理。
现在有一个分销活动,每个人都可以成为分销人进行分享活动,一旦有人通过分享的活动连接购买之后分销人会有收益信息,当然分销活动商品也可以不通过分享链接而是直接购买,但是不会存在分销收益一说。表结构方面,所有的订单都存入订单表order
中,对于存在分销关系的会将分销绑定信息(分销人与被分销人)记录到record
表中,不通过分销直接购买的不会在record
表中添加记录。现在要求统计一下当天的订单总数与分销记录总数,假设当天为2022.11.08。
如果是单独统计计算很简单,直接统计总数就可以:
统计当天的总订单数:
1 | SELECT COUNT (1) total_couut FROM order WHERE DATE_FORMAT(order_create_time, '%Y-%m-%d' ) = '2022-11-08' |
统计当天的分销总的分销记录数:
1 | SELECT COUNT (1) record _count FROM record WHEREDATE_FORMAT(create_time, '%Y-%m-%d' ) = '2022-11-08' |
但是如何将两个不同的统计信息封装到一个结果集中,这里提供一种处理方案,使用union all
进行并列查询,然后进行求和查询。具体实现方式如下。
为保证查询出来的参数信息一致,查询订单总数时补充上分销记录总数,查询分销记录总数补充上订单总数,具体实现如下:
1 2 3 |
SELECT COUNT (1) total_couut,0 record_count FROM order WHERE DATE_FORMAT(order_create_time, '%Y-%m-%d' ) = '2022-11-08' union all SELECT 0 total_count, COUNT (1) record _count FROM record WHEREDATE_FORMAT(create_time, '%Y-%m-%d' ) = '2022-11-08' |
查询结果如下:
现在已经查询出总订单数和总分销记录数,下面需要处理的是如何封装到一个结果集中,处理的方式也很简单,就是直接求和,因为对应的字段值都为0,。具体实现如下:
1 2 3 4 |
select sum (t.total_count) total_count, sum (t.record_count) record_count from ( SELECT COUNT (1) total_couut,0 record_count FROM order WHERE DATE_FORMAT(order_create_time, '%Y-%m-%d' ) = '2022-11-08' union all SELECT 0 total_count, COUNT (1) record _count FROM record WHEREDATE_FORMAT(create_time, '%Y-%m-%d' ) = '2022-11-08' ) t |
查询结果如下:
至此问题解决,一条sql将多条无法进行关联的sql封装到一个结果集中。
2023-10-30
windows上的mysql服务突然消失提示10061 Unkonwn error问题及解决方案2023-10-30
MySQL非常重要的日志bin log详解2023-10-30
详解MySQL事务日志redo log一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...
2023-10-30
Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...
2023-10-30