pg(union all)统计总数count

本文探讨了在使用SQL进行分页查询时,如何优化带有Union All的查询语句来更有效地获取记录总数。传统的两步查询法在遇到Union All时需调整策略,通过将各部分计数统一并作为子查询执行Sum(COUNT),从而提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在分页查询中,常用的一种做法是分两部分查询;第一部分用limit查询出需要的条数,第二步用count函数查询出总数;

sql1:  select t.id,t.create_by,t.create_date 
       from table t
       limit 0 offset 10

sql2 : select count(t.id) from talbe t

但是如果用到 union all 去查询结果集,在查询总数的时候就需要修改一下了,一般的思路是把union all 两端的数量字段统一,然后作为一个子表,执行sum(coun)就可以了;

大概是这样:

SELECT SUM	( tmpcount ) 
FROM
	(
    SELECT COUNT( t1.ID ) AS tmpcount 
    FROM	table t1 
     UNION ALL
    SELECT COUNT( t2.ID ) AS tmpcount 
    FROM w008_vedio_album t2
	) A

实际中用到的一种情境实例:

SELECT SUM
	( tmpcount ) 
FROM
	(
SELECT COUNT
	( A.ID ) AS tmpcount 
FROM
	w008_video_addr_info
	A LEFT JOIN sys_user s ON A.create_by = s.login_name
	LEFT JOIN w008_user_business_info info ON s.ID = info.sysuserid
	LEFT JOIN bpe_attach_file file ON A.ID = file.ID 
WHERE
	A.is_removed =0
	AND A.isshelves = 30 UNION ALL
SELECT COUNT
	( A.ID ) AS tmpcount 
FROM
	w008_vedio_album
	A LEFT JOIN sys_user s ON A.create_by = s.login_name
	LEFT JOIN w008_user_business_info info ON s.ID = info.sysuserid 
WHERE
	A.is_removed =0
	AND EXISTS (
SELECT
	rela.ID 
FROM
	w008_album_video_rela rela
	JOIN w008_video_addr_info addr ON rela.videoaddrinfo = addr.ID 
WHERE
	rela.vedioalbum = A.ID 
	AND addr.isshelves = 30 
	) 
	) A

结果:

 

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值