2012-07-06 92 views
5

这工作:如何在codeigniter中的COUNT查询上执行num_rows()?

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

如何做一个COUNT(*)查询NUM_ROWS?还有更好的性能明智的第二种方式吗?

+0

我还要提到用笨的Active Record类来帮助组织代码的一个位更好。 – 2012-07-06 01:48:37

回答

13

做一个COUNT(*)只会给你包含的行数,而不是结果本身一个单排。

要访问COUNT(*),你需要做的

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

第二个选项执行好得多,因为它不需要返回一个数据集,以PHP而只是计数,因此更加优化。

+3

+1,但可能值得一提的是,您可以为列添加别名,然后使用它。像'SELECT COUNT(*)AS cnt ...',然后使用'$ result ['cnt']'。 – Corbin 2012-07-06 01:44:59

+0

@Corbin是我必须这样做,COUNT(*)作为关键不起作用的原因。 – TK123 2012-07-06 15:53:09

+1

跳过一步,直接引用结果,而不是先将它设置为数组:'COUNT(*)AS cnt ...',然后通过$ query-> row(0) - > cnt'访问它 – Frug 2013-03-14 19:30:33

0

这将只返回1行,因为你只是选择COUNT()。你会在这种情况下使用mysql_num_rows()$query

如果要获得每个ID的计数,请将GROUP BY id添加到字符串末尾。

性能明智的,不要永远永远永远使用*在查询中。如果表格中有100个唯一字段,并且您想要全部获取它们,则可以全部写出100个字段,而不是*。这是因为*必须重新计算有多少场去,每一次它抓住一个领域,这需要更多的时间来打电话。您COUNT()查询

4

NUM_ROWS将字面上永远是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'; 
}