为了账号安全,请及时绑定邮箱和手机立即绑定

使用offset + limit查找mySQL查询中的结果总数

使用offset + limit查找mySQL查询中的结果总数

慕无忌1623718 2019-11-19 10:20:57
我正在使用Codeigniter执行分页功能,但我认为这通常适用于PHP / mySQL编码。我正在使用offset和limit检索目录列表,具体取决于每页要多少结果。但是要知道所需的总页数,我需要知道(结果总数)/(限制)。现在,我正在考虑第二次运行SQL查询,然后计算所需的行数,但不使用LIMIT。但是我认为这似乎是在浪费计算资源。有没有更好的方法?谢谢!编辑:我的SQL查询也使用WHERE来选择具有特定'category_id'的所有行
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

从MySQL 8.0.17开始,SQL_CALC_FOUND_ROWS查询修饰符和随附的FOUND_ROWS()函数已弃用,并将在以后的MySQL版本中删除。作为替代,考虑使用LIMIT执行查询,然后再使用COUNT(*)且不使用LIMIT执行第二个查询,以确定是否还有其他行。例如,代替这些查询:


SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;

SELECT FOUND_ROWS();

请改用以下查询:


SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;

SELECT COUNT(*) WHERE id > 100;

COUNT(*)受到某些优化。SQL_CALC_FOUND_ROWS导致一些优化被禁用。


查看完整回答
反对 回复 2019-11-19
?
交互式爱情

TA贡献1712条经验 获得超3个赞

考虑到SQL_CALC_FOUND_ROWS需要调用FOUND_ROWS()之后,如果你想获取总数有,而不必调用第二从限制返回的结果SELECT,我会使用JOIN源于一个结果子查询:


SELECT * FROM `table` JOIN (SELECT COUNT(*) FROM `table` WHERE `category_id` = 9) t2 WHERE `category_id` = 9 LIMIT 50

注意:每个派生表必须具有自己的别名,因此请确保命名连接表。在我的示例中,我使用t2。


查看完整回答
反对 回复 2019-11-19
  • 3 回答
  • 0 关注
  • 1322 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信