MySql中SQL_CALC_FOUND_ROWS和FOUND_ROWS函数的使用

作用

在写分页程序时,常用的一条语句是:

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的情况下将返回的行数。因此:

  1. SQL_CALC_FOUND_ROWS应该放在UNION的第一个SELECT后边(否则MySql将会提示Sql语句错误)。
  2. FOUND_ROWS()函数返回的是UNION ALL的结果,如果你使用的是UNION,那么只能得到近似结果。
  3. 如果在带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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值