90

可能重复:
在 mySQL 查询中使用 offset+limit 查找结果总数

我有一个非常复杂的 sql 查询,它返回分页的结果。问题是要在 LIMIT 之前获得总行数,我必须运行 sql 查询两次。第一次不使用limit子句获取总行数。sql 查询非常复杂,我认为它们必须是一种更好的方法,无需运行两次查询。

4

1 回答 1

117

幸运的是,从 MySQL 4.0.0 开始,您可以在查询中使用选项,这将告诉 MySQL 计算不考虑子句SQL_CALC_FOUND_ROWS的总行数。LIMIT您仍然需要执行第二个查询才能检索行数,但它是一个简单的查询,并不像检索数据的查询那么复杂。用法很简单。在您的主查询中,您需要在第二个查询SQL_CALC_FOUND_ROWS之后添加选项,SELECT您需要使用FOUND_ROWS()函数来获取总行数。查询将如下所示:

SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE 'a%' LIMIT 10;

SELECT FOUND_ROWS();

唯一的限制是您必须在第一个查询之后立即调用第二个查询,因为SQL_CALC_FOUND_ROWS不会在任何地方保存行数。尽管此解决方案还需要两个查询,但它的速度要快得多,因为您只执行一次主查询。您可以在 MySQL 文档中阅读有关SQL_CALC_FOUND_ROWS 和 FOUND_ROWS()的更多信息。

编辑:您应该注意,在大多数情况下,运行两次查询实际上比SQL_CALC_FOUND_ROWS. 看这里

编辑 2019:

SQL_CALC_FOUND_ROWS 查询修饰符和随附的 FOUND_ROWS() 函数自 MySQL 8.0.17 起已弃用,并将在未来的 MySQL 版本中删除。

https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows

建议COUNT改用

SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
于 2012-10-14T22:45:01.743 回答