在一个接口的分页查询中出现了一个这样的问题:
查询查出来了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 对两个相同的集合也要合并。
坑踩多了 人就有经验了。
在这里表白一下浩彬,他一定想不到千里之外还有个男生一直挂念他。