我正在制作搜索页面以查找用户。我有查询查找它们,实际上我可以用“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 "
单字条件:
"WHERE A.username LIKE ? OR P.name LIKE ? OR P.name LIKE ? OR P.surname LIKE ? OR P.surname LIKE ? LIMIT ?,?"
多字条件:
"WHERE CONCAT(P.name, ' ', P.surname) LIKE ? LIMIT ?,?"
非常感谢。
答案 0 :(得分:3)
像这样修改查询:
SELECT SQL_CALC_FOUND_ROWS * FROM accounts ... LIMIT ...
这将返回与之前相同的限制/偏移结果(例如,结果的第一页),但是如果您然后立即将第二个查询发送到服务器...
SELECT FOUND_ROWS();
如果先前的查询没有LIMIT
,则服务器将返回已返回的总行数。这是你的总结果数。
这当然意味着您的初始查询需要更长时间,因为优化器无法使用任何可能允许它在满足LIMIT
后停止评估行的快捷方式,但在某些情况下,不会无论如何都有这样的捷径。
这是你正在努力完成的“官方”机制。
http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows
答案 1 :(得分:0)
您可以使用以下内容:
SELECT (select count(*) from produtos) as counter, column1, column2, column3, column4 FROM accounts AS A INNER JOIN profiles AS P ON A.account_id = P.account_id WHERE A.username LIKE ? OR P.name LIKE ? OR P.name LIKE ? OR P.surname LIKE ? OR P.surname LIKE ? LIMIT ?,?;
不是选择所有(*),而是使用每个列名,并创建另一个名为counter的列。