SQL分页查询同时获取总记录数异常:DataCount始终返回1求解
问题分析与解决方案
嘿,我来帮你捋清楚问题出在哪,以及怎么搞定这个分页+总记录数的需求~
为什么你的写法会返回1?
你当前的查询里用了group by myCol1, myCol2,这会让SQL把每一组(myCol1和myCol2的唯一组合)当成一条结果行。这时候count(t.id)统计的是当前分组内的记录数量,而不是符合where mycol3='blah'条件的所有记录总数。因为你分页查询的是单条行数据,每个分组里只有1条记录,所以DataCount自然一直是1啦。而且这个group by其实是多余的——你只是要查询行数据,不是做分组聚合统计。
正确的解决方法
这里给你两种常用的靠谱写法:
方法1:用CTE(公共表表达式)拆分分页和总数统计
这种写法逻辑清晰,把分页数据和总条数分开计算,最后关联起来:
WITH PageData AS ( -- 先查分页需要的数据 SELECT myCol1, mycol2 FROM MyTable WHERE mycol3 = 'blah' OFFSET (@skip) rows fetch next (@take) rows only ), TotalCount AS ( -- 单独统计符合条件的总记录数 SELECT COUNT(*) AS DataCount FROM MyTable WHERE mycol3 = 'blah' ) -- 把分页数据和总条数关联,每一行都带上总数 SELECT pd.myCol1, pd.mycol2, tc.DataCount FROM PageData pd, TotalCount tc;
方法2:用窗口函数COUNT(*) OVER()(更简洁)
如果你的数据库支持窗口函数(比如SQL Server 2012及以上版本),可以直接用这个写法,一步到位:
SELECT myCol1, mycol2, COUNT(*) OVER() AS DataCount -- 统计where过滤后的所有记录总数 FROM MyTable WHERE mycol3 = 'blah' OFFSET (@skip) rows fetch next (@take) rows only;
COUNT(*) OVER()会基于where条件过滤后的整个数据集计算总数,不需要分组,所以每一行分页数据都会正确带上符合条件的总记录数,写法也更简洁。
内容的提问来源于stack exchange,提问作者GregH
相关产品推荐
相关产品推荐

