使用LIMIT和OFFSET时如何用SQL获取符合条件的总记录数
获取分页查询的总记录数:SQL原生实现更高效
当然可以直接通过SQL语句获取符合条件的总记录数,完全没必要把所有数据拉到页面端再计数——这种做法在数据量小的时候可能看不出问题,但数据多了会严重拖慢页面加载速度,还浪费服务器带宽和资源。
给你两种靠谱的实现方式:
1. 直接用COUNT(*)统计(通用所有数据库)
最稳妥的方式是把原查询的SELECT部分替换成COUNT(*),保留所有JOIN和WHERE条件,这样就能精准统计符合筛选条件的总记录数:
SELECT COUNT(*) AS total_records FROM nfc_film JOIN nfc_film_category ON nfc_film.film_id = nfc_film_category.film_id JOIN nfc_category ON nfc_category.category_id = nfc_film_category.category_id WHERE title LIKE :searchterm OR nfc_category.name = :category;
执行这个查询后,你会得到一个名为total_records的字段,值就是你需要的总条数。注意一定要保证这个查询的WHERE条件和你分页查询的WHERE条件完全一致,避免出现总数和实际分页数据不匹配的情况。
2. 用SQL_CALC_FOUND_ROWS(仅MySQL支持)
如果你用的是MySQL数据库,可以用一个更便捷的方式:在分页查询前加上SQL_CALC_FOUND_ROWS,然后通过FOUND_ROWS()函数获取总记录数:
-- 第一步:执行分页查询,加上SQL_CALC_FOUND_ROWS标记 SELECT SQL_CALC_FOUND_ROWS nfc_film.*, nfc_category.name FROM nfc_film JOIN nfc_film_category ON nfc_film.film_id = nfc_film_category.film_id JOIN nfc_category ON nfc_category.category_id = nfc_film_category.category_id WHERE title LIKE :searchterm OR nfc_category.name = :category LIMIT 10 OFFSET :offset; -- 第二步:获取总记录数 SELECT FOUND_ROWS() AS total_records;
这种方式的好处是不需要重复写一遍WHERE条件,但要注意它是MySQL独有的语法,如果你以后可能切换到PostgreSQL等其他数据库,还是优先用第一种通用方式。
总之,用SQL直接统计总记录数是最优解,比前端计数高效得多,也更准确。
内容的提问来源于stack exchange,提问作者Adam Cole
相关产品推荐
相关产品推荐

