end*_*ndy 2 php sql pagination
所以我正在为类似博客的系统创建一个分页系统.我已经有了使用limit,offset限制查询的整个概念.但是,我在创建实际导航时遇到了问题.
我不知道如何计算我总共的页数.现在,显然我可以运行一个简单地选择所有行的计数的查询,但是,我觉得这不是最有效的方法.
无论如何我可以在原始查询中拉到总行数吗?
$this->DB->build( array('select' => 'a.*',
'from' => array( 'ccs_custom_database_1' => 'a' ),
'order' => 'field_3 DESC',
'where' => 'field_6=",1,"',
'limit' => array($page,10),
'add_join' => array(
array(
'select' => 'm.members_display_name,m.members_seo_name',
'from' => array( 'members' => 'm' ),
'type' => 'inner',
'where' => 'a.member_id=m.member_id'
),
array(
'select' => 'c.category_name,c.category_furl_name',
'from' => array( 'ccs_database_categories' => 'c' ),
'type' => 'inner',
'where' => 'a.category_id=c.category_id'
)),
));
Run Code Online (Sandbox Code Playgroud)
如果您的表使用MyISAM引擎,则运行COUNT(*)是O(1)操作,因为它保留总行数的缓存值.
即使你没有使用它,或者查询略有不同,我怀疑做一个单一COUNT会成为系统的瓶颈.
如果它确实是一个巨大的问题(我建议在一张桌子上测试一些你期望的假数据),一种选择就是采取一种稍微务实的方法.在您的用例中,您的用户可能会有所不同,但是,接受无论如何都没有人真正使用分页.最多,你可以期望有人在放弃之前经历2或3页.使用过滤和排序将用户想要的数据推送到第一页.
然而,即使有筛选和排序,你仍然需要显示一些排序分页的可能,所以你可以采取这种做法:给定的15条记录页大小,选择第151(15页*10页+ 1)记录并计算您获得的数量.如果数字小于该数字,则显示"第1页,共8页"或其他内容.如果数字是151,那么你有超过10页,所以显示"第1页".这是我在一张桌子上使用的一种方法,它拥有大约1200万条记录并且运行良好.