我在Codeigniter模型中使用复杂的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();
非常感谢任何帮助!
答案 0 :(得分:29)
我以前对分页有完全相同的要求,我能够使用CodeIgniter Active Record使其工作。
首先,在select语句中将选项SQL_CALC_FOUND_ROWS
设置为伪列,并将escape query设置为false:
$this->db->select('SQL_CALC_FOUND_ROWS null as rows, other columns ...',FALSE);
然后,在使用limit和offset执行查询后,将结果集分配给返回数组:
$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;
答案 1 :(得分:0)
我可以想到的一种方法是在调用函数时使用变量$ count,它会是这样的:
function your_function($ count = 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();