我遇到了一个问题...
我有一堆像这样的陈述......
$this->db->where('Pool', "1");
$this->db->where('Bedrooms >=', "3");
然后是限制声明
$this->db->limit($limit, $offset);
最后我的陈述
$query = $this->db->get('table-name');
我的问题是我需要在限制语句之前计算结果,以获得没有限制的总行数。所以我尝试了这个..
$this->db->where('Pool', "1");
$this->db->where('Bedrooms >=', "3");
$num_rows = $this->db->count_all_results();
$this->db->limit($limit, $offset);
$query = $this->db->get('table-name');
这将使用where语句计算我的行。但是,get语句现在获取没有先前where语句工作的记录。
它不可见,但是有大量代码处理更多语句,并在网址中抓取内容,所以我不想再执行两次数据检索以解决此问题...
干杯!
答案 0 :(得分:12)
我知道这是一个老问题,但我遇到了这个问题,并想出了一个不同的解决方案。
我们的想法是在限制和偏移之前获取db类的副本。
$this->db->where('Pool', "1");
$this->db->where('Bedrooms >=', "3");
//here we use the clone command to create a shallow copy of the object
$tempdb = clone $this->db;
//now we run the count method on this copy
$num_rows = $tempdb->from('table-name')->count_all_results();
$this->db->limit($limit, $offset);
$query = $this->db->get('table-name');
答案 1 :(得分:5)
$get_data = $this->your_model->get_data();
$data = $get_data['data'];
$count = $get_data['count'];
模型
function get_data($limit = 10, $offset= 0)
{
$table = 'table-name';
$where = array('Pool' => 1, 'Beedrooms >=' 3);
$return['data'] = $this->db->from($table)->where($where)->limit($limit, $offset)->get();
$return['count'] = $this->db->from($table)->where($where)->count_all_results();
return $return;
}
答案 2 :(得分:4)
$this->db->select('*');
$this->db->from('users');
$this->db->where('active',$status);
//open1 here we copy $this->db in to tempdb and apply
//count_all_results() function on to this tempdb
$tempdb = clone $this->db;
$num_results= $tempdb->count_all_results();
// now applying limit and will get actual result
$this->db->limit(10);
$this->db->get();
$query = $this->db->last_query();
$res = $this->db->query($query);
$data_array = array('num_results' => $num_results, 'results' => $res->result() );
return $data_array;
答案 3 :(得分:3)
我知道这是一个老问题,但我找到了一个非常简单的解决方案。
//do your select, from and where
$this->db->select('your selects');
$this->db->from('your table');
$this->db->where('your where');
//get the filtered rows count
//the trick is the first empty parameter and second false parameter
$filtered_count = $this->db->count_all_results('', false);
//limit your results and get the rows
$this->db->limit($length, $start);
$results = $this->db->get()->result_array();
希望它有助于某人
答案 4 :(得分:1)
很明显,您需要使用两个不同的查询。使用单个查询尽可能快地完成此操作是最佳的,但由于您需要在第二个查询之前获取所有记录,因此我们需要使用两个查询。
但是,您可以根据MySQL使用的引擎优化第一个查询。如果您使用InnoDB,那么您应该使用SELECT COUNT(*) FROM <table-name>
因为总行大小缓存在InnoDB中。
我相信count_all_rows
使用count(*)
来提高效果,您应该直接使用此方式进行排序。
使用MyISAM,您可以使用COUNT(<column-name>)
。
因此,您的模型类中有一个count函数,它返回表的计数,然后您可以调用该函数来插入/更新/从数据库中获取数据。
答案 5 :(得分:0)
您可以使用mys {的SQL_CALC_FOUND_ROWS
SELECT SQL_CALC_FOUND_ROWS * FROM table1
WHERE
cond1, cond2, ..., condN
LIMIT 10
SELECT FOUND_ROWS();
这是使用mysql,你可能需要检查如何使用它的codeignitor方式。
参考:
https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows
答案 6 :(得分:0)
我知道这个问题很旧,但是我遇到了同样的问题,并且得到的解决方案比此处显示的要简单。无需两次构建查询,也无需克隆db class
。添加where
部分,然后添加limit
并执行查询后,只需计算结果而无需花费查询构建器。
$this->db->where('Pool', 1);
$this->db->where('Beedrooms >=' 3);
$count = $this->db->count_all_results('table-name', false); // No reset query builder
$this->db->limit($limit, $offset)
$result = $this->db->get();
您将拥有两个变量:
$count
和结果数,$result
和结果数。