在 MySQL 中,FOUND_ROWS 函数用于返回对带有 LIMIT 子句的 SELECT 语句。如果没有 LIMIT 子句,将返回的行数。
一个 SELECT 语句可能包含一个 LIMIT 子句来限制服务器返回给客户端的行数。在某些情况下,希望知道在没有 LIMIT 的情况下该语句将返回多少行,但无需再次运行该语句。要获取此行数,请在 SELECT 语句中包含 SQL_CALC_FOUND_ROWS 选项,然后调用 FOUND_ROWS() 函数。
SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 在您想要用 LIMIT 限制查询返回的行数,但也需要不再次运行查询的情况下得知完整结果集中的行数而很有用。一个示例 Web 脚本,它呈现一个分页显示,其中包含指向显示搜索结果其他部分的页面的链接,使用 FOUND_ROWS() 可以确定剩余结果需要多少其他页面。
对于 UNION 语句,SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 的使用比简单的 SELECT 语句更复杂,因为 LIMIT 可能出现在 UNION 中的多个位置。它可以应用于 UNION 中的单个 SELECT 语句,或全局应用于整个 UNION 结果。
UNION 的 SQL_CALC_FOUND_ROWS 的意图是它应该返回在没有全局 LIMIT 的情况下返回的行数。将 SQL_CALC_FOUND_ROWS 与 UNION 一起使用的条件是:
SQL_CALC_FOUND_ROWS 关键字必须出现在 UNION 的第一个 SELECT 中。
仅当使用 UNION ALL 时,FOUND_ROWS() 的值才是准确的。如果使用不带 ALL 的 UNION,则会发生重复删除,并且 FOUND_ROWS() 的值只是近似值。
如果 UNION 中不存在 LIMIT,则忽略 SQL_CALC_FOUND_ROWS 并返回为处理 UNION 而创建的临时表中的行数。
除了这里描述的情况之外,FOUND_ROWS() 的行为是未定义的(例如,它的值跟随一个因错误而失败的 SELECT 语句)。
(1)使用 FOUND_ROWS() 函数查询 SELECT 语句去掉 LIMIT 子句后返回的总行数。如下:
mysql> select SQL_CALC_FOUND_ROWS * from t_user limit 1,3; +----+------+-----+-----+---------+ | id | name | sex | age | salary | +----+------+-----+-----+---------+ | 2 | 李四 | 男 | 27 | 7523.00 | | 3 | 王五 | 女 | 22 | 6760.30 | | 4 | 赵六 | 男 | 24 | 6810.50 | +----+------+-----+-----+---------+ 3 rows in set (0.05 sec) mysql> select FOUND_ROWS(); +--------------+ | FOUND_ROWS() | +--------------+ | 7 | +--------------+ 1 row in set (0.05 sec)
如果您使用 SELECT SQL_CALC_FOUND_ROWS,MySQL 必须计算完整结果集中有多少行。但是,这比在没有 LIMIT 的情况下再次运行查询要快,因为不需要将结果集发送到客户端。