codeigniter 活动记录获取查询和不带 LIMIT 子句的查询

Posted

技术标签:

【中文标题】codeigniter 活动记录获取查询和不带 LIMIT 子句的查询【英文标题】:codeigniter active record get query and query without the LIMIT clause 【发布时间】:2011-11-17 07:46:00 【问题描述】:

我使用活动记录,一切正常,但我想将 $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;
    

【问题讨论】:

可能是这个***.com/a/23648274/2664160 //忽略这个评论 he he 【参考方案1】:

您可以使用SQL_CALC_FOUND_ROWS 来获取在没有-LIMIT 的情况下会返回的行数。注意select 行中的,FALSE。这告诉 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;

【讨论】:

谢谢..我认为 CI 会为此做好准备,但“普通”mysql 更好 我认为他们没有内置,因为SQL_CALC_FOUND_ROWS 仅适用于 MySQL,而 CodeIgniter 应该适用于所有数据库类型。 第二个 sn-p 中的第二行似乎不正确,它给出了错误。我建议: $query = $this->db->query('SELECT FOUND_ROWS() as Count')->row(); $result['size'] = $query->Count; 这是一个很好的解决方案,但其中存在一个问题。如果您使用的是 MySQL DB Engine,那么它将完美运行,但如果您要更改任何其他数据库(如 Oracle),那么此解决方案不会工作。【参考方案2】:

试试这个:

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;
    

【讨论】:

仅供参考 _compile_select 在 CodeIgniter 2.0.3+ 中不可用。 github.com/EllisLab/CodeIgniter/issues/276 Fixe for Issue #276@KyleFarris 帮助研究人员永远不会太晚。 result() 无条件返回一个数组,因此您不需要 if 块。 $data["results"] = $q->result();【参考方案3】:

我实际上建议使用 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();

【讨论】:

【参考方案4】:
$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'];

【讨论】:

这个答案缺少教育解释。

以上是关于codeigniter 活动记录获取查询和不带 LIMIT 子句的查询的主要内容,如果未能解决你的问题,请参考以下文章

活动记录 CodeIgniter 2 中的这个查询有啥问题?

codeigniter 活动记录,生成,但不执行查询

CodeIgniter 活动记录在子查询中的位置

codeigniter 查询生成器和活动记录 sql 注入

Codeigniter 活动记录查询的工作方式与自定义查询不同

CONCAT sql 查询需要正确的格式。 Codeigniter 活动记录