2012-07-06 158 views
5

Esto funciona:¿Cómo hacer un num_rows() en COUNT consulta en codeigniter?

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

Pero esto no es así:

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

cómo hacer un num_rows en un (*) consulta COUNT? ¿También lo está haciendo de la 2da forma? ¿Algún mejor rendimiento sabio?

+0

También debo mencionar a utilizar la clase Active Record CodeIgniter para ayudar a organizar su código un poco mejor. –

Respuesta

13

Al hacer un COUNT(*), solo obtendrá una fila única que contiene el número de filas y no los resultados en sí.

Para acceder a COUNT(*) que tendría que hacer

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

La segunda opción realiza mucho mejor, ya que no tiene que devolver un conjunto de datos para PHP, pero en cambio sólo un recuento y por lo tanto es mucho más optimizado.

+3

+1, pero podría valer la pena mencionar que puede alias la columna y luego usar eso. Como 'SELECT COUNT (*) AS cnt ...' y luego use '$ result ['cnt']'. – Corbin

+0

@Corbin sí, tuve que hacerlo así, COUNT (*) ya que la clave no funcionaba por alguna razón. – TK123

+1

Omita un paso y consulte directamente el resultado sin establecerlo primero como una matriz: 'COUNT (*) AS cnt ...' y luego acceda a través de '$ query-> row (0) -> cnt' – Frug

0

Esto solo devolverá 1 fila, porque solo está seleccionando un COUNT(). utilizará mysql_num_rows() en el $query en este caso.

Si desea obtener un recuento de cada uno de los ID, agregue GROUP BY id al final de la cadena.

En cuanto a rendimiento, nunca use * en sus consultas. Si hay 100 campos únicos en una tabla y desea obtenerlos todos, escriba todos los 100, no *. Esto se debe a que * tiene que volver a calcular la cantidad de campos que tiene que recorrer, cada vez que toma un campo, lo que requiere mucho más tiempo para llamar.

4

num_rows en su consulta COUNT() SIEMPRE será SIEMPRE 1. Es una función agregada sin una cláusula GROUP BY, por lo que todas las filas se agrupan en una sola. Si desea el valor del recuento, debe darle un identificador SELECT COUNT(*) as myCount ..., luego use su método normal de acceso a un resultado (el primero, único resultado) y obtenga su propiedad 'myCount'.

0

me gustaría sugerir en vez de hacer otra consulta con los mismos parámetros acaba de inmediato que ejecutan un SELECT FOUND_ROWS()

6

En CI es muy simple en realidad, todo lo que necesita es

$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() 

El número de filas devueltas por la consulta. Nota: En este ejemplo, $ consulta es la variable que el objeto resultado de la consulta se asigna a:

$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'; 
} 
Cuestiones relacionadas