9

我遇到了一个问题...

我有一堆这样的地方陈述......

$this->db->where('Pool', "1");
$this->db->where('Bedrooms >=', "3");

然后是一个限制语句

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

最后是我的 get 声明

$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 语句没有工作。

它是不可见的,但是有大量的代码处理更多的 where 语句,并在 url 中抓取东西,所以我不想为了解决这个问题而执行两次数据检索......

干杯!

4

7 回答 7

17

我知道这是一个老问题,但我只是遇到了这个问题并想出了一个不同的解决方案。

这个想法是在限制和偏移之前获取 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');
于 2013-07-10T04:29:19.740 回答
15

我知道这是一个老问题,但我找到了一个非常简单的解决方案。

//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();

希望它可以帮助某人

于 2018-01-18T12:41:44.300 回答
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;
}
于 2012-09-07T22:14:57.753 回答
5
    $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;
于 2014-05-14T07:32:33.350 回答
1

很明显,您需要使用两个不同的查询。最好使用单个查询尽快完成此操作,但由于您需要在第二个查询之前获取所有记录,因此我们需要使用两个查询。

但是,您可以根据与 MySQL 一起使用的引擎优化第一个查询。如果您使用 InnoDB,那么您应该使用SELECT COUNT(*) FROM <table-name>因为总行大小缓存在 InnoDB 中。

我相信count_all_rows用于count(*)性能,您应该直接使用它进行排序。

使用 MyISAM,您可以使用COUNT(<column-name>).

因此,您的模型类中有一个计数函数,它返回表的计数,然后您可以调用该函数从数据库中插入/更新/获取数据。

于 2012-09-08T18:52:58.883 回答
1

你可以使用SQL_CALC_FOUND_ROWSmysql

SELECT SQL_CALC_FOUND_ROWS * FROM table1
WHERE
  cond1, cond2, ..., condN
LIMIT 10

选择 FOUND_ROWS();

这是使用 mysql,你可能需要检查如何使用它 codeignitor 方式。

参考:

https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows

于 2017-08-22T05:31:04.193 回答
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结果。

于 2018-11-17T16:27:19.803 回答