0

ユーザーがコンテンツに投票できる投稿テーブルがあります。投票順に投稿を閲覧する機能を追加したいと考えています。各ページに表示される投稿数を制限し、ページネーション システムを実装したいと考えています。

したがって、LIMIT および offset パラメータを使用して行を取得する方法を理解していますが、これはデータベースで順序付けされたとおりにデータを取得します。CIでページネーションを実装する方法を知っています。投票列を ORDER BY する方法も知っていますが、2つを組み合わせて複数のページで正しい出力を得る方法がわかりません。LIMIT と ORDER BY を行う方法は次のとおりです。

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

どのように動作するか:

各ページに 10 件の投稿が投票順に並べられている場合、最初のページには上位 10 件が含まれ、2 ページ目には 11 番目から 20 番目に投票数の多い投稿が含まれる必要があります。

これまでのところ、投票によって並べ替えられた送信テーブルからすべてのデータを配列に取得し、それをページネーションのデータ ソースとして使用するだけです。ただし、データセットが大きくなるにつれて、これはかなり非効率的になります。各ページに適切なデータのみを選択できるようにする、知らない SQL があるかどうかを知りたいですか?

4

2 に答える 2

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 に答える
0

これは、要件を満たすクエリを効率的に作成する方法です。制限とオフセットを設定したため、クエリは必要なデータのみをフェッチします。ただし、提出テーブルのデータが高すぎる場合は、提出テーブルの投票列にインデックスを作成することをお勧めします。

于 2012-07-16T06:04:16.263 に答える