作用
在写分页程序时,常用的一条语句是:
SELECT COUNT(*) FROM ... WHERE ...
以此来获得记录的总数。
除此以外,还可以通过SQL_CALC_FOUND_ROWS获得记录总数。
SELECT SQL_CALC_FOUND_ROWS ... FROM ... WHERE ... LIMIT ...;
SELECT FOUND_ROWS();
此时,在执行第一条语句时就会缓存总记录数,并在FOUND_ROWS()后返回。
例子:
#employee表有128条记录
SELECT SQL_CALC_FOUND_ROWS * FROM employee LIMIT 10, 10;
-> 省略
SELECT FOUND_ROWS();
-> 128
需要说明的是,如果没有指定SQL_CALC_FOUND_ROWS,FOUND_ROWS()函数将会返回查询出来的行数;如果查询带有limit,FOUND_ROWS()函数将返回查询的最远到达行。
例子:
#employee表有128条记录
SELECT * FROM employee;
-> 省略
SELECT FOUND_ROWS();
-> 128
SELECT * FROM employee limit 10, 10;
-> 省略
SELECT FOUND_ROWS();
-> 20
在UNION中使用SQL_CALC_FOUND_ROWS
在带有UNION的查询中使用SQL_CALC_FOUND_ROWS情况会更加复杂,因为LIMIT可以加在每个UNION的查询里边,也可以加在总的查询里边。如果在带有UNION的语句中使用SQL_CALC_FOUND_ROWS,那么后续FOUND_ROWS()函数返回的是没有全局LIMIT的情况下将返回的行数。因此:
- SQL_CALC_FOUND_ROWS应该放在UNION的第一个SELECT后边(否则MySql将会提示Sql语句错误)。
- FOUND_ROWS()函数返回的是UNION ALL的结果,如果你使用的是UNION,那么只能得到近似结果。
- 如果在带UNION的SELECT语句中不包括LIMIT,那么SQL_CALC_FOUND_ROWS将会被忽略,后续使用FOUND_ROWS()函数将会返回MySql为UNION操作创建的临时表的行数。
例子:
#总行数:207
select SQL_CALC_FOUND_ROWS employee_id id
from t_emp_employee
union all
select unit_id id
from t_org_unit
limit 10, 10;
-> 省略
SELECT FOUND_ROWS();
-> 207