2012-07-06 2 views
5

Это работает:Как сделать num_rows() по запросу COUNT в codeigniter?

 $sql = "SELECT id 
       FROM `users` 
       WHERE `account_status` = '" . $i . "'"; 
     $query = $this->db->query($sql); 
     var_dump($query->num_rows()); 

Но это вовсе не так:

 $sql = "SELECT COUNT(*) 
       FROM `users` 
       WHERE `account_status` = '" . $i . "'"; 
     $query = $this->db->query($sql); 
     var_dump($query->num_rows()); 

Как сделать num_rows на COUNT (*) запроса? И делает ли это второй способ лучшей производительности?

+0

Я должен также упомянуть использовать активный класс записи CodeIgniter, чтобы помочь организовать ваш код немного лучше. –

ответ

13

Выполнение COUNT(*) даст вам уникальную строку, содержащую количество строк, а не результаты сами.

COUNT(*) Для доступа вам нужно будет сделать

$result = $query->row_array(); 
$count = $result['COUNT(*)']; 

Второй вариант работает намного лучше, так как не нужно возвращать набор данных в PHP, но вместо этого просто подсчет и, следовательно, гораздо более оптимизированы.

+3

+1, но, возможно, стоит упомянуть, что вы можете использовать псевдоним столбца, а затем использовать его. Подобно 'SELECT COUNT (*) AS cnt ...', а затем используйте '$ result ['cnt']'. – Corbin

+0

@ Corbin yea Мне пришлось сделать это так, COUNT (*), поскольку ключ почему-то не работал. – TK123

+1

Пропустите шаг и обратитесь непосредственно к результату, не устанавливая его как массив: 'COUNT (*) AS cnt ...', а затем получить доступ к нему через '$ query-> row (0) -> cnt' – Frug

0

Это только вернет 1 строку, потому что вы просто выбираете COUNT(). вы в этом случае будете использовать mysql_num_rows() на $query.

Если вы хотите получить счет каждого из ID, добавьте GROUP BY id в конец строки.

Производительность, никогда не используйте * в ваших запросах. Если в таблице есть 100 уникальных полей, и вы хотите получить их все, вы выписываете все 100, а не *. Это связано с тем, что * должен пересчитывать, сколько полей он должен уходить, каждый раз, когда он захватывает поле, для которого требуется много времени.

4

num_rows в запросе COUNT() будет буквально ВСЕГДА быть 1. Это агрегатная функция без предложения GROUP BY, поэтому все строки сгруппированы в один. Если вы хотите присвоить значение, вы должны указать ему идентификатор SELECT COUNT(*) as myCount ..., а затем использовать обычный метод доступа к результату (первый, единственный результат) и получить его свойство «myCount».

0

я предлагаю вместо делать другой запрос с теми же параметрами, просто сразу работает с SELECT FOUND_ROWS()

6

В CI это действительно просто на самом деле, все, что вам нужно, это

$this->db->where('account_status', $i); 
$num_rows = $this->db->count_all_results('users'); 
var_dump($num_rows); // prints the number of rows in table users with account status $i 
5
$query->num_rows() 

Количество строки, возвращаемые запросом. Примечание: В этом примере, $ запрос переменная, объект результата запроса присваивается:

$query = $this->db->query('SELECT * FROM my_table'); 

echo $query->num_rows(); 
0
$list_data = $this->Estimate_items_model->get_details(array("estimate_id" => $id))->result(); 
    $result = array(); 
    $counter = 0; 
    $templateProcessor->cloneRow('Title', count($list_data)); 
    foreach($list_data as $row) { 
     $counter++; 
     $templateProcessor->setValue('Title#'.$counter, $row->title); 
     $templateProcessor->setValue('Description#'.$counter, $row->description); 
     $type = $row->unit_type ? $row->unit_type : ""; 
     $templateProcessor->setValue('Quantity#'.$counter, to_decimal_format($row->quantity) . " " . $type); 
     $templateProcessor->setValue('Rate#'.$counter, to_currency($row->rate, $row->currency_symbol)); 
     $templateProcessor->setValue('Total#'.$counter, to_currency($row->total, $row->currency_symbol)); 
    } 
0
$query = $this->db->get(); 
if ($query->num_rows() > 0) { 
    echo 'have row'; 
} else { 
    echo 'no row return from db'; 
} 
Смежные вопросы