MySQL - 如何在分页前计算行数?

wil*_*lpr 5 java mysql pagination rows count

我正在创建一个搜索页面来查找用户.我有查询查找它们,实际上我可以用"LIMIT startRow,numberRows"进行分页.但是,如何计算在进行分页之前找到的"寄存器"总数?我想在我的搜索页面添加搜索中找到的用户数.

我需要这样的东西:"第1页,共100页".我实际上我有"第1页",但我不知道如何计算分页前的结果总数.

¿也许可能需要用"SELECT COUNT(*)"执行额外的查询?¿是否有另一种方法可以在分页前计算以避免另一个查询?

我使用两个SQL查询,一个用于单个字,另一个用于多字:

基本sql查询(用于单字和多字搜索):

"SELECT * FROM accounts AS A INNER JOIN profiles AS P ON A.account_id = P.account_id "
Run Code Online (Sandbox Code Playgroud)

单字条件:

"WHERE A.username LIKE ? OR P.name LIKE ? OR P.name LIKE ? OR P.surname LIKE ? OR P.surname LIKE ? LIMIT ?,?"
Run Code Online (Sandbox Code Playgroud)

多字条件:

"WHERE CONCAT(P.name, ' ', P.surname) LIKE ? LIMIT ?,?"
Run Code Online (Sandbox Code Playgroud)

非常感谢.

Mic*_*bot 7

像这样修改查询:

SELECT SQL_CALC_FOUND_ROWS * FROM accounts ... LIMIT ...
Run Code Online (Sandbox Code Playgroud)

这将返回与之前相同的有限/偏移结果(例如结果的第一页),但如果您立即将第二个查询发送到服务器......

SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)

LIMIT服务器将返回如果没有对前一个查询施加则将返回的总行数。这是您的结果总数。

当然,这意味着您的初始查询需要更长的时间,因为优化器无法采用任何可能允许它在满足后停止评估行的快捷方式LIMIT,但在某些情况下,无论如何都没有这样的快捷方式可用。

这是完成您想要完成的任务的“官方”机制。

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