笨活动记录 - 总计数找到的行与限制(MySQL的)(Codeigniter Active Reco

2019-09-03 06:03发布

我使用的是在应用了极限笨模型复杂的SQL查询。 我想指望会被发现,如果限制并没有被用于抵消行的总数。

我想返回计数,结果阵列一起,我的控制器 - 我该怎么做呢? 我应该把SQL_CALC_FOUND_ROWS,如果这是正确的解决方案?

这里的查询(这是我没有自己建原):

$this->db
  ->select('table1.*
      ,table2.*
      ,table3.*
      ,table4.*
      ,table5.*
      ,table6.*
      ,table7.*
      ,table8.*
      ,table9.*
      ,(SELECT GROUP_CONCAT(field1) FROM table10 WHERE table10.field3 = table9.field2) as categories
      ,(SELECT GROUP_CONCAT(field1) FROM table5 WHERE table5.field11 = table4.field12 AND table4.field21 = 0 AND table5.field1 != 0) as categories2
      ,(SELECT AVG(table11.field4) FROM table11 WHERE table11.field6 = table9.field2) as rating
      ,(SELECT COUNT(table12.field5) FROM table12 WHERE table12.field7 = table9.field2) as rated_times')
  ->from('table9')  
  ->join('table10', 'table10.field3 = table9.field2')
  ->join('categories', 'categories.field1 = table10.field1')
  ->join('table3', 'table3.field8 = table9.field2')
  ->join('table1', 'table1.id = table9.field2')
  ->join('table2', 'table2.field9 = table9.field2 AND table2.field19 = 1', 'left')
  ->join('table4', 'table4.field10 = table9.field2 AND table4.field21 = 0', 'left')
  ->join('table5', 'table5.field11 = table4.field12 AND table5.field1 != 0', 'left')
  ->join('table6', 'table6.field13 = table9.field2 AND table6.field22 BETWEEN SYSDATE() - INTERVAL 90 DAY AND SYSDATE()', 'left')
  ->join('table7', 'table7.field14 = table9.field2', 'left')
  ->join('table8', 'table8.field15 = table9.field2', 'left')
  ->where('table1.field16', NULL)
  ->where($where_clause_1, null, FALSE)
  ->where('table9.field17', $searchArray['search_country'])
  ->or_where($or_where_clause_2, null, FALSE)
  ->or_where($or_where_clause_3, null, FALSE)
  ->or_where($or_where_clause_4, null, FALSE)
  ->or_where($or_where_clause_5, null, FALSE)
  ->or_where($or_where_clause_6, null, FALSE)
  ->or_where($or_where_clause_7, null, FALSE)
  ->like('table9.field17', $searchArray['search_country'])
  ->order_by('table3.field18', 'ASC')
  ->order_by('table2.field19', 'DESC')
  ->order_by('table1.field20', 'DESC')
  ->group_by('table9.field2')
  ->limit($limit, $offset);    


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

return $data->result_array();

非常感谢所有帮助!

Answer 1:

我之前有分页完全相同的要求,我能使其工作用笨活动记录。

首先,设置选项SQL_CALC_FOUND_ROWS在你的SELECT语句是伪列,并设置逃生查询为false:

$this->db->select('SQL_CALC_FOUND_ROWS null as rows, other columns ...',FALSE);

然后,用限制执行查询和到位偏移后分配结果集返回数组:

$data = $this->db->get();
$return['results'] = $data->result();
// Do something with the results

最后,运行第二个查询来获取发现行也赋值给返回数组。 我使用的方法链接在这里做这一切在一个步骤。

$return['rows'] = $this->db->query('SELECT FOUND_ROWS() count;')->row()->count;

并返回结果和行数阵列。

return $return;


Answer 2:

我能想到的一个方法是有变量$ count,当你打电话给你的功能,它会是这样的:

功能your_function($计数= FALSE){

$this->db->select(...)

//before limit you do this:

if($count != FALSE):

return $this->db->get->result_array()

else :

return $this->db->limit($limit, $offset)->get()->result_array();

endif;
}

这样,您就可以调用两个时间 - 一个用于计数和另一个用于限制查询:

$count = count($this->your_function(TRUE));
$data['query] = $this->your_function();


文章来源: Codeigniter Active Record - Count Total Found Rows with Limit (MySQL)