如何在执行带条件与LIMIT的SQL列查询时同时获取表总行数?
解决方案
当然有办法实现,下面是几种常用的方案,适配不同场景:
方案1:子查询内嵌总数
直接在SELECT字段里加入子查询,获取满足col3=0条件的总行数,每条结果都会附带这个总数:
SELECT col1, col2, (SELECT COUNT(*) FROM `table` WHERE col3=0) AS total_rows FROM `table` WHERE col3=0 LIMIT 500;
优势:一次查询完成所有需求,无需额外执行语句;缺点:总数会重复出现在每一行数据中,存在少量冗余。
方案2:MySQL专属的SQL_CALC_FOUND_ROWS(仅适用于MySQL)
如果你的数据库是MySQL,可利用这个特性:先执行带SQL_CALC_FOUND_ROWS的查询,再通过FOUND_ROWS()获取无LIMIT限制时的总行数:
-- 第一步:获取分页数据,同时让MySQL计算符合条件的总行数 SELECT SQL_CALC_FOUND_ROWS col1, col2 FROM `table` WHERE col3=0 LIMIT 500; -- 第二步:获取总行数 SELECT FOUND_ROWS() AS total_rows;
优势:避免重复执行WHERE条件的COUNT查询,性能更优;注意:这是MySQL独有的语法,PostgreSQL、SQL Server等数据库不支持。
方案3:用UNION ALL合并数据与总数
如果希望把数据行和总行数放在同一个结果集里,可通过UNION ALL拼接两个查询:
-- 获取分页数据,total_rows字段设为NULL SELECT col1, col2, NULL AS total_rows FROM `table` WHERE col3=0 LIMIT 500 -- 拼接总数查询,数据字段设为NULL UNION ALL SELECT NULL, NULL, COUNT(*) AS total_rows FROM `table` WHERE col3=0;
优势:一次查询返回所有内容;缺点:需要在应用层判断哪一行是总数(比如通过col1是否为NULL),若col1本身允许NULL值,还需额外标识字段区分。
内容的提问来源于stack exchange,提问作者John B
相关产品推荐
相关产品推荐

