开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 13586|回复: 0

mysql FOUND_ROWS获取查询总记录数,分页时用

[复制链接]

0

精华

2

贡献

17

赞扬

帖子
11
软币
123
在线时间
7 小时
注册时间
2018-12-22
发表于 2019-1-11 13:27:43 | 显示全部楼层 |阅读模式
一个包含limit的select语句限制了返回的数据条数,但有些情况下我们想同时获取除去limit后匹配的行数,但又不想多次执行select语句,此时可以在select语句中增加SQL_CALC_FOUND_ROW选项,然后调用FOUND_ROWS()函数:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name    -> WHERE id > 100 LIMIT 10;mysql> SELECT FOUND_ROWS();

第二个select语句返回了第一个select语句匹配的行数。
如果select语句没有使用SQL_CALC_FOUND_ROWS选项,使用FOUND_ROWS()将获得select返回的行数。如果select使用了limit从句,FOUND_ROWS() 返回的数据为limit匹配的最大值,比如: 使用”LIMIT 10”时返回10,使用使用”LIMIT 50,10”时返回60.
FOUND_ROWS()获取的值是瞬时值,其只会关联最后一条select语句。如果接下来需要使用这个值,需要将它保存到一个变量里面:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;mysql> SET @rows = FOUND_ROWS();

如果你使用了SELECT SQL_CALC_FOUND_ROWS,MySQL会计算全量结果匹配的行数。尽管如此,也比重新执行查询语句要快,因为这涉及到服务器与客户端之间的交互。
SQL_CALC_FOUND_ROWS 和 FOUND_ROWS()对限定返回数据量并需要匹配的总行数的情况非常有帮助,比如在web页面分页显示查询结果的时候。
在UNION语句中使用SQL_CALC_FOUND_ROWS 和 FOUND_ROWS()要比简单的SELECT语句中使用复杂很多,因为可以在多个UNION语句中使用LIMIT从句。它可能作用于UNION中的单个select语句,也可能是整个UNION语句 。
在不含全局LIMIT从句的UNION语句中使用SQL_CALC_FOUND_ROWS的条件如下:
  • SQL_CALC_FOUND_ROWS必须在第一个select语句上。
  • FOUND_ROWS()的值只在UNION ALL中是准确,否则由于去重只能得到一个近似值。
  • 如果没有使用LIMIT从句,SQL_CALC_FOUND_ROWS会被忽略,返回的值是UNION语句创建的临时表中的行数。
  • 除了上述情况外,FOUND_ROWS()是未定义的。

注意
FOUND_ROWS()在statement-based模式下是不一定准确的,在row-based模式下可以使用。

评分

参与人数 1赞扬 +1 收起 理由
zhang32323 + 1 感谢分享

查看全部评分

回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-12-22 09:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表