可能重复:
Find total number of results in mySQL query with offset+limit
我有一个非常复杂的SQL查询,它返回分页的结果。问题是在LIMIT之前得到总行数我必须运行两次sql查询。第一次没有limit子句来获取总行数。 sql查询非常复杂,我认为如果不运行两次查询,它们必须是更好的方法。
答案 0 :(得分:90)
幸运的是,自MySQL 4.0.0起,您可以在查询中使用SQL_CALC_FOUND_ROWS
选项,这将告诉MySQL计算忽略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 and FOUND_ROWS()的更多信息。
编辑:您应该注意,在大多数情况下,运行查询两次实际上比SQL_CALC_FOUND_ROWS
更快。见here