0

我有一个提交表,用户可以在其中对内容进行投票。我想添加按投票顺序浏览提交的功能。我想限制每个页面上出现的提交数量并实现分页系统。

所以我了解如何使用 LIMIT 和 offset 参数来检索行,但是这会按照数据库中的顺序获取数据。我知道如何在 CI 中实现分页。我也知道如何按投票列排序,但我不确定如何将两者结合起来,以便在多个页面上获得正确的输出。以下是我执行 LIMIT 和 ORDER BY 的方式:

$this->db->limit($count);
$this->db->order_by('votes','desc');
$query = $this->db->get('submission', $num, $offset);

它应该如何工作:

如果每个页面有 10 个按投票排序的提交,则第一页应包含前 10 名,第二页应包含投票数从第 11 到第 20 的提交,依此类推。

到目前为止,我所做的只是简单地将提交表中按投票排序的所有数据检索到一个数组中,然后将其用作分页的数据源。但是,随着数据集的增长,这将变得相当低效,我想知道是否有一些我不知道的 SQL 将允许我只为每个页面选择适当的数据?

4

2 回答 2

0

这是为您的需求编写查询的有效方式。因为由于您设置了限制和偏移量,因此查询仅获取所需的数据。但是如果提交表上的数据太高,我会建议在提交表上的投票列上创建一个索引。

于 2012-07-16T06:04:16.263 回答
0

所以看起来我可以通过使用 ORDER BY 后跟 LIMIT 和 OFFSET 来构造一个查询。我最初尝试使用嵌套选择,但没有必要过于复杂。

下面是使用 CodeIgniter 的 Active Record 类的 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);

这完全符合我的要求,而无需在排序之前从表中获取所有提交。

于 2012-07-17T00:27:41.840 回答