2013-12-12 63 views
1

我從數據庫提取一些列表並將其顯示在分頁屏幕中。但是對於分頁,我需要計算結果的總數。我正在使用Codeigniter和ActiveRecords。我的查詢是這樣的:活動記錄中的結果總數和限制

$query = $this->db->select('sum(amount) as sum') 
       ->where(date_added between '$from' and '$to') 
       ->group_by('date_added') 
       ->get('my_table'); 

我需要有和沒有獲取值的總數量限制運行此查詢,並獲得與限制分頁輸出。現在我需要再次複製查詢並運行限制。有沒有其他辦法,以便我可以將完整的查詢對象複製到另一個變量並再次調用get?

回答

1

您正在尋找活動記錄緩存 http://ellislab.com/codeigniter/user-guide/database/active_record.html#caching

public function cache_query() { 

$this->db->start_cache(); 
$this->db->select('sum(amount) as sum') 
       ->where(date_added between '$from' and '$to') 
       ->group_by('date_added'); 
$this->db->stop_cache(); 
} 

public function get_query() { 

$this->build_query(); 
$query = $this->db->get('my_table'); 
$this->db->flush_cache(); 

} 

public function count_query() { 
$this->build_query(); 
$query = $this->db->count_all('my_table'); 
$this->db->flush_cache(); 
} 
+0

很酷。要試一試 –

+0

哇這是工作。我一直在尋找這樣的事情很長一段時間。謝謝大衛:) –

+1

當然。謝謝你讓我知道你解決了你的問題。這比問題更重要 –

0

嘗試這樣 在你的控制器

function yourFunction() 
{ 
$total_rows=$this->modal_name->function_name()->num_rows(); 
$this->db->limit(1,20); // set you limit here 
$rows=$this->modal_name->function_name()->result_array(); 

}

1

的一種方式,你可以使用SQL_CALC_FOUND_ROWS在您選擇查詢與我限制還需要運行FOUND_ROWS(),這將使的計數沒有限制

$query = $this->db->select('SQL_CALC_FOUND_ROWS sum(amount) as sum') 
       ->where(date_added between '$from' and '$to') 
       ->group_by('date_added') 
       ->get('my_table') 
       ->limit($perpage, $start); 

然後,你需要得到所有行數

$query = $this->db->query('SELECT FOUND_ROWS() AS `count`'); 
echo $query->row()->count; 

FOUND_ROWS()

+0

怎麼樣的表現呢? –

+0

我建議你至於性能,它更好地有一個查詢有限的結果和總結果的計數,而不是再次運行查詢來罰款計數和加快你需要主要通過分配適當的數據類型的MySQL標準列,通常在where子句中使用的字段的合適索引 –

+0

是的。只是在這裏閱讀這裏可以比在某些情況下運行兩次quries慢10倍。http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/或 –

0
 
you use to limit. 
$this->db->limit($limit, $start); 
+0

我認爲你不明白這個問題。這不是如何應用限制。這是我怎樣才能一次又一次地使用相同的查詢,它已經回答了。 –