Я столкнулся с проблемой …
У меня есть куча, где такие статусы …
$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');
Это подсчитывает мои строки с хорошими инструкциями. Однако инструкция get теперь получает записи без предыдущего, где действуют операторы.
Это не видно, но есть большая часть кода, обрабатывающая больше операторов, и захватывая вещи в URL-адресах. Поэтому я бы предпочел не выполнять извлечение данных дважды, чтобы исправить это …
Ура!
$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; }
Я знаю, что это старый вопрос, но я просто столкнулся с этой проблемой и придумал другое решение.
Идея состоит в том, чтобы взять копию класса 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');
$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;
Совершенно очевидно, что вам нужно будет использовать два разных запроса. Было бы оптимально сделать это как можно быстрее, используя один запрос, но так как вам нужно получить все записи перед вторым запросом, нам нужно использовать два запроса.
Тем не менее, вы можете оптимизировать первый запрос на основе движка, который вы используете с MySQL. Если вы используете InnoDB, вы должны использовать SELECT COUNT(*) FROM <table-name>
потому что общий размер строки кэшируется в InnoDB.
Я считаю, что count_all_rows
использует count(*)
для производительности, и вы должны быть отсортированы, используя это прямо.
С MyISAM вы можете использовать COUNT(<column-name>)
.
Таким образом, у вас есть функция count в вашем классе модели, которая возвращает счетчик для вашей таблицы, а затем вы можете вызвать функцию для вставки / обновления / получения данных из вашей базы данных.
Вы можете использовать SQL_CALC_FOUND_ROWS
mysql
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