可能重复:
在使用偏移量和限制条件的MySQL查询中找到总结果数
我有一个非常复杂的SQL查询,返回的结果是分页的。问题是,在应用LIMIT之前获取总行数,我必须运行两次SQL查询。SQL查询非常复杂,我认为必须有更好的方法在不运行两次查询的情况下完成此操作。
可能重复:
在使用偏移量和限制条件的MySQL查询中找到总结果数
我有一个非常复杂的SQL查询,返回的结果是分页的。问题是,在应用LIMIT之前获取总行数,我必须运行两次SQL查询。SQL查询非常复杂,我认为必须有更好的方法在不运行两次查询的情况下完成此操作。
幸运的是,自MySQL 4.0.0以来,您可以在查询中使用SQL_CALC_FOUND_ROWS
选项,告诉MySQL忽略LIMIT
子句并计算总行数。您仍需要执行第二个查询才能检索行计数,但它是一个简单的查询,不像检索数据的查询那样复杂。
使用方法非常简单。在主查询中,您需要在SELECT
后添加SQL_CALC_FOUND_ROWS
选项,在第二个查询中,您需要使用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
更快。请参见here
编辑2019: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;
COUNT
的问题在于:https://github.com/sequelize/sequelize/issues/11692,当有多个 JOINS 时,计数可能不会返回预期结果。 - Yanick Rochon
SQL_CALC_FOUND_ROWS
的建议,但事实是具有相同条件的COUNT(*)
更有效。 - zerkms