我有一个提交表,用户可以在其中对内容进行投票。我想添加按投票顺序浏览提交内容的功能。我想限制出现在每个页面上的提交数量,并实现分页系统。
因此,我了解如何使用LIMIT和offset参数来检索行,但这会按照数据库中的顺序获取数据。我知道如何在CI中实现分页。我也知道如何按投票列排序,但我不确定如何将两者结合起来,以便在多个页面上获得正确的输出。以下是我的极限和顺序:
$this->db->limit($count);
$this->db->order_by('votes','desc');
$query = $this->db->get('submission', $num, $offset);
它应该如何工作:
如果每页有10份按投票顺序排列的提交文件,则第一页应包含前10份,第二页应包含投票数第11至第20位的提交文件
到目前为止,我的做法是简单地从提交表中按投票顺序将所有数据检索到一个数组中,然后将其用作分页的数据源。然而,随着数据集的增长,这将变得相当低效,我想知道是否有一些我不知道的SQL允许我只为每个页面选择合适的数据?
这是为您的需求编写查询的有效方法。因为由于设置了限制和偏移量,所以查询只获取所需的数据。但如果提交表上的数据太高,我建议在提交表上创建一个投票列索引。
因此,看起来我可以通过使用ORDER by和LIMIT和OFFSET进行分页来构造查询。我最初尝试使用嵌套选择,但没有必要过于复杂。
以下是使用CodeIgniter的ActiveRecord类的PHP代码:
function get_submission_by_vote_pagination($num, $offset)
{
$this->db->order_by('votes','desc');
$query = $this->db->get('submission', $num, $offset);
return $query->result_array();
}
有了这个功能,就可以很容易地使用CI内置的分页功能:
//setup pagination
$config['base_url'] = base_url() . 'browse/index';
$config['total_rows'] = $this->Submission_model->count_all();
$config['per_page'] = '10';
$config['full_tag_open'] = '<div id="pagination">';
$config['full_tag_close'] = '</div>';
$config['first_link'] = 'First';
$config['last_link'] = 'Last';
$this->pagination->initialize($config);
$submissions = $this->Submission_model->get_submission_by_vote_pagination(
$config['per_page'], $this->uri->segment(3));
$this->load->view('browse_page',$submissions);
这完全符合我的要求,而无需在排序前从表中获取所有提交的内容。