跳到主要内容
版本:V1.0.0

FOUND_ROWS

声明

FOUND_ROWS()

说明

一个 SELECT 语句可能包含一个 LIMIT 子句,用来限制数据库服务器端返回客户端的行数。在某些情况下,不需要再次运行该语句而得知在没有 LIMIT 时到底该语句返回了多少行。我们可以在 SELECT 语句中选择使用 SQL_CALC_FOUND_ROWS,然后调用 FOUND_ROWS() 函数,获取该语句在没有 LIMIT 时返回的行数。

如下例所示:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();

第二个 SELECT 语句返回一个数字,表示在没有 LIMIT 子句的情况下,第一个 SELECT 语句返回了多少行。如果上述的 SELECT 语句不使用 SQL_CALC_FOUND_ROWS 选项,使用 LIMIT 和不使用 LIMIT 时,FOUND_ROWS() 可能会返回不同的结果。

通过 FOUND_ROWS() 函数返回的有效行数是瞬时的,并且不能越过 SELECT SQL_CALC_FOUND_ROWS 语句后面的语句。如果您后续还需要用到这个值,就需要将其保存。

如下例所示:

SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
SET @rows = FOUND_ROWS();

假如您正在使用 SQL_CALC_FOUND_ROWS,系统必须计算出在全部结果集合中有多少行。尽管如此,这也还是比不用 LIMIT 而再次运行查询要快,原因是结果集合不需要被发送到客户端。

SQL_CALC_FOUND_ROWSFOUND_ROWS() 在当您希望限制一个查询返回的行数时是很有用的,同时还能不需要再次运行查询就可以确定全部结果集合中的行数。例如提供页式显示的 Web 脚本时,该显示包含显示搜索结果其他部分的页的链接。使用 FOUND_ROWS() 可以确定剩下的结果需要多少其他的页。

SQL_CALC_FOUND_ROWSFOUND_ROWS() 的应用对于 UNION 查询比对于简单 SELECT 语句更为复杂,原因是在 UNION 中,LIMIT 可能会出现在多个位置。它可能适用于 UNION 中的独立的 SELECT 语句,或是整个的 UNION 结果。

SQL_CALC_FOUND_ROWS 对于 UNION 的期望结果是在没有全局的 LIMIT 的条件下,返回应有的行数。SQL_CALC_FOUND_ROWSUNION 一同使用的条件是:

  • SQL_CALC_FOUND_ROWS 关键词必须出现在 UNION 的第一个 SELECT 中。

  • FOUND_ROWS() 的值只有在使用 UNION ALL 时才是精确的。如果使用不带 ALLUNION,则会发生两次删除,而 FOUND_ROWS() 的值是近似的。

  • 如果 UNION 中没有出现 LIMIT,则 SQL_CALC_FOUND_ROWS 被忽略,返回临时表中所创建的用来处理 UNION 的行数。

示例

SELECT SQL_CALC_FOUND_ROWS * FROM t2;
SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
| 3 |
+--------------+
1 row in set (0.001 sec)