MySQL - 如何在分页前统计行数?
MySQL - How to count rows before pagination?
我正在制作一个搜索页面来寻找用户。我有查询来找到它们,实际上我可以用 "LIMIT startRow, numberRows" 进行分页。但是,在进行分页之前,如何计算找到的 "registers" 总数呢?我想在我的搜索页面上添加在搜索中找到的用户数。
我需要这样的东西:"Page 1 of 100"。我实际上有 "Page 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 ?,?"
非常感谢。
您可以使用这样的方法:
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 的列。
像这样修改查询:
SELECT SQL_CALC_FOUND_ROWS * FROM accounts ... LIMIT ...
这将 return 与以前相同的 limited/offset 结果(例如结果的第一页),但是如果您随后立即将第二个查询发送到服务器...
SELECT FOUND_ROWS();
服务器将 return 如果 LIMIT
没有被强加于先前的查询,则将被 return 编辑的总行数。这是您的结果总数。
当然,这意味着您的初始查询需要更长的时间,因为优化器无法采取任何可能允许它在满足 LIMIT
后停止评估行的捷径,但在某些情况下, 无论如何都没有这样的快捷方式。
这是 "official" 实现您想要完成的目标的机制。
http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows
我正在制作一个搜索页面来寻找用户。我有查询来找到它们,实际上我可以用 "LIMIT startRow, numberRows" 进行分页。但是,在进行分页之前,如何计算找到的 "registers" 总数呢?我想在我的搜索页面上添加在搜索中找到的用户数。
我需要这样的东西:"Page 1 of 100"。我实际上有 "Page 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 ?,?"
非常感谢。
您可以使用这样的方法:
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 的列。
像这样修改查询:
SELECT SQL_CALC_FOUND_ROWS * FROM accounts ... LIMIT ...
这将 return 与以前相同的 limited/offset 结果(例如结果的第一页),但是如果您随后立即将第二个查询发送到服务器...
SELECT FOUND_ROWS();
服务器将 return 如果 LIMIT
没有被强加于先前的查询,则将被 return 编辑的总行数。这是您的结果总数。
当然,这意味着您的初始查询需要更长的时间,因为优化器无法采取任何可能允许它在满足 LIMIT
后停止评估行的捷径,但在某些情况下, 无论如何都没有这样的快捷方式。
这是 "official" 实现您想要完成的目标的机制。
http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows