2012-07-06 30 views
5

này hoạt động:Làm cách nào để thực hiện num_rows() trên COUNT truy vấn trong trình mã hóa?

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

Nhưng điều này không:

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

Làm thế nào để làm một NUM_ROWS trên COUNT (*) truy vấn? Ngoài ra là làm nó theo cách thứ 2 bất kỳ hiệu suất tốt hơn khôn ngoan?

+0

Tôi cũng nên đề cập đến sử dụng CodeIgniter Active Record lớp để giúp tổ chức mã của bạn một chút tốt hơn. –

Trả lời

13

Làm một COUNT(*) sẽ chỉ cung cấp cho bạn một hàng số ít chứa số hàng và không phải là kết quả.

Để truy cập COUNT(*) bạn sẽ cần phải làm

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

Lựa chọn thứ hai thực hiện tốt hơn nhiều vì nó không cần phải trả lại một tập dữ liệu để PHP mà thay vào đó chỉ là một số lượng và do đó được nhiều hơn nữa được tối ưu hóa.

+3

+1, nhưng có thể đáng nói đến là bạn có thể bí danh cột và sau đó sử dụng cột đó. Giống như 'SELECT COUNT (*) AS cnt ...' và sau đó sử dụng '$ result ['cnt']'. – Corbin

+0

@Corbin yea Tôi phải làm như vậy, COUNT (*) là chìa khóa không hoạt động vì một lý do nào đó. – TK123

+1

Bỏ qua một bước và tham khảo trực tiếp đến kết quả mà không đặt nó thành mảng trước: 'COUNT (*) AS cnt ...' và sau đó truy cập nó qua '$ query-> row (0) -> cnt' – Frug

0

Điều này sẽ chỉ trả về 1 hàng, vì bạn chỉ đang chọn COUNT(). bạn sẽ sử dụng mysql_num_rows() trên $query trong trường hợp này.

Nếu bạn muốn đếm số của mỗi số ID, hãy thêm GROUP BY id vào cuối chuỗi.

Hiệu suất khôn ngoan, không bao giờ sử dụng * trong truy vấn của bạn. Nếu có 100 trường duy nhất trong một bảng và bạn muốn có tất cả chúng, bạn viết ra tất cả 100, không phải là *. Điều này là do * phải tính toán lại bao nhiêu trường mà nó phải đi, mỗi lần nó lấy một trường, mất nhiều thời gian hơn để gọi.

4

num_rows trên truy vấn COUNT() của bạn theo nghĩa đen luôn là 1. Đây là hàm tổng hợp không có mệnh đề GROUP BY, vì vậy tất cả các hàng được nhóm lại với nhau thành một. Nếu bạn muốn số giá trị của số, bạn nên cung cấp số nhận dạng SELECT COUNT(*) as myCount ..., sau đó sử dụng phương pháp truy cập thông thường của kết quả (kết quả đầu tiên, duy nhất) và nhận thuộc tính 'myCount'.

0

tôi muốn đề nghị thay vì làm truy vấn khác với các thông số tương tự chỉ ngay lập tức chạy một SELECT FOUND_ROWS()

6

Trong CI nó thực sự đơn giản trên thực tế, tất cả bạn cần là

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

Số các hàng được trả về bởi truy vấn. Lưu ý: Trong ví dụ này, $ query là biến mà đối tượng kết quả truy vấn được gán cho:

$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'; 
} 
Các vấn đề liên quan