Union 和 union all 一次bug记录

在一个接口的分页查询中出现了一个这样的问题:

查询查出来了14条记录, 但是分页计数却只显示了7条。  这是为什么?

第一反应把sql打印出来看一下:

select sum(count) from ( (select count(*)  from ues_consumer , app_security_log , ues_device where ues_consumer.id = app_security_log.operate_user and app_security_log.user_type = 0 and app_security_log.log_type = 'device' and app_security_log.device_id = ues_device.id and app_security_log.operate_date BETWEEN '2021-01-04 00:00:00' and '2021-01-12 23:59:59') Union  (select count(*)  from cbo_user , app_security_log , ues_device where app_security_log.operate_user = cbo_user.id and app_security_log.user_type = 1 and app_security_log.log_type = 'device' and app_security_log.device_id = ues_device.id and app_security_log.operate_date BETWEEN '2021-01-04 00:00:00' and '2021-01-12 23:59:59') ) as countNumber

跑一下一看:

真的查询了7条, 分页统计时确实是7条, 但是List取了14条, 为什么?

把list打印出来看一下:

(select app_security_log.* , ues_consumer.full_name as userName , ues_device.device_name as deviceName from ues_consumer , app_security_log , ues_device where ues_consumer.id = app_security_log.operate_user and app_security_log.user_type = 0 and app_security_log.log_type = 'device' and app_security_log.device_id = ues_device.id and app_security_log.operate_date BETWEEN '2021-01-04 00:00:00' and '2021-01-12 23:59:59' order by app_security_log.operate_date desc, app_security_log.id asc  ) Union all (select app_security_log.* , cbo_user.name as userName , ues_device.device_name as deviceName from cbo_user , app_security_log , ues_device where app_security_log.operate_user = cbo_user.id and app_security_log.user_type = 1 and app_security_log.log_type = 'device' and app_security_log.device_id = ues_device.id and app_security_log.operate_date BETWEEN '2021-01-04 00:00:00' and '2021-01-12 23:59:59' order by app_security_log.operate_date desc, app_security_log.id asc ) 

真的取了14条记录。  为什么查出来的数据和统计的分页数据会不一样呢?

继续观察 , 有一个字段是区分app用户和管理端用户的,(红框勾出),数一下 字段值为0的有7个,  而字段值为1的也有7个。

所有理所应当的怀疑 是不是统计总数时 union 不好使了? 

百度, 看到这样一句话:

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

原来是统计时 两个sql分别count( )计数 算出来的数值一样, 两个count集合都是7 , 所以union在合并时, 不对相同集合进行合并。 所以 sum()函数加起来的数字时7 。 

这里只需要将union 改成 union all 就好。  union all 对两个相同的集合也要合并。

坑踩多了  人就有经验了。

在这里表白一下浩彬,他一定想不到千里之外还有个男生一直挂念他。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值