codeigniter活动记录获取没有LIMIT子句的查询和查询

时间:2011-09-14 19:27:54

标签: php mysql codeigniter activerecord

我正在使用活动记录,它的工作正常但我想将 $ data [“totalres”] 设置为总结果,我的意思是相同的查询但没有 LIMIT

问题是当你执行查询修饰符时,前面的语句被取消设置,所以在得到结果后我甚至不能添加$ this-> db-> limit()。

任何想法?我认为,为了做到这一点,“复制”查询是一种不好的做法

function get_search($start, $numrows, $filter = array())
{    

    ...

    $this->db
    ->select("emp")
    ->from('emp')
    ->join('empr', 'empr.b = empr.id', 'left')
    ->like('code', $code)
    ->limit($numrows, $start);

    ...

    $q = $this->db->get();        

    // number of rows WITHOUT the LIMIT X,Y filter
    $data["totalres"] = ???????;        

    if ($q->num_rows() > 0)
    {        
        $data["results"] = $q->result();
    } else {
        $data["results"] = array();
    }   

    return $data;
}    

4 个答案:

答案 0 :(得分:38)

您可以使用SQL_CALC_FOUND_ROWS来获取已返回的行数 - LIMIT。请注意,FALSE行中的select。这告诉CodeIgniter不要尝试使用反引号来转义SELECT子句(因为SQL_CALC_FOUND_ROWS不是字段,并且CodeIgniter没有意识到这一点。)

$this->db
->select("SQL_CALC_FOUND_ROWS emp", FALSE)
->from('emp')
->join('empr', 'empr.b = empr.id', 'left')
->like('code', $code)
->limit($numrows, $start);

$q = $this->db->get();

然后在运行该查询之后,我们需要运行另一个查询来获取总行数。

$query = $this->db->query('SELECT FOUND_ROWS() AS `Count`');
$data["totalres"] = $query->row()->Count;

答案 1 :(得分:1)

试试这个:

function get_search($start, $numrows, $filter = array()){    
    $tmp= $this->db
    ->select("emp")
    ->from('emp')
    ->join('empr', 'empr.b = empr.id', 'left')
    ->like('code', $code)
    ->_compile_select();

    $q= $this->db->limit($numrows, $start)->get();

    // number of rows WITHOUT the LIMIT X,Y filter

    $data["totalres"] = $this->db->query($tmp)->num_rows();

    if ($q->num_rows() > 0){        
        $data["results"] = $q->result();
    } else {
        $data["results"] = array();
    }   
    return $data;
}    

答案 2 :(得分:1)

我实际上建议使用CI查询缓存。

要使用此功能,请启动缓存,在没有限制的情况下构建查询。运行查询以获取完整计数,然后应用限制并运行查询以获取具有所需偏移量的页面列表。

缓存将记住已定义的变量。

然后,您可以清除缓存以供后续查询。

实施例

    $this->db->start_cache();

    // Where, like, having clauses in here

    $this->db->stop_cache();

    $count = $this->db->get('table')->num_rows();

    $this->db->limit('limit', 'offset');

    $result = $this->db->get('table')->result_array();

    $this->db->flush_cache();

答案 3 :(得分:0)

$this->db
->select("SQL_CALC_FOUND_ROWS emp", FALSE)
->from('emp')
->join('empr', 'empr.b = empr.id', 'left')
->like('code', $code)
->limit($numrows, $start); $q = $this->db->get();

$query = $this->db->query('SELECT FOUND_ROWS() AS `Count`');
$data["totalres"] = $this->db->get()->row()->Count;

CodeIgniter 2.1.0未运行,下面的代码将修复它。

$query = $this->db->query('SELECT FOUND_ROWS() AS `Count`');
$objCount = $query->result_array();
$data["totalres"] = $objCount[0]['Count'];