2016-11-12 91 views
1

我有一个复杂的SELECT与几个耗时的计算字段。我只想要前100行,但是,我还需要找到总行数。这意味着执行查询一次LIMIT和一次没有。如何使用CodeIgniter QueryBuilder一次构建多个查询?

我希望能够与CodeIgniter的QueryBuilder同时构建两个SELECT,并消除第二个查询中耗时的计算字段。

我想知道是否有一个很好的方式与QB做到这一点,或者我应该建立没有QB的SELECT

更新:显然我困惑的人。我需要做这样的事情:

为了让记录显示:

SELECT id, [ several really time intensive calculated fields ] 
FROM table 
WHERE [some complicated criteria] 
LIMIT 100; 

得到总的记录,我想重新使用内置查询或同时,但没有建立一个第二一个限制并且仅带有ID字段:

SELECT id 
FROM table 
WHERE [some complicated criteria]; 

另一种选择是:我已经了解到,如果我将时间密集的计算字段放在子SELECT中,Postgres将不会执行它,直到实际检索到该行。

现在我手动建立两个查询,但我想要正确的QueryBuilder方式。

回答

0

无法在codeigniter中的一条语句中运行多个查询。但是,你可能会做如下

$query1 = $this->db->query('SELECT * FROM table_name LIMIT 10'); 
$query2 = $this->db->query('SELECT * FROM table_name'); 

但我做的是使一个方法,并调用基于参数一样

public function get_rows($table, $num_rows = FALSE){ 
    $this->db->select('*'); 
    $this->db->from($table); 
    if($num_rows === FALSE){ 
    $this->db->limit(10); 
    } 

    $query = $this->db->get(); 
    if($num_rows){ 
    return $query->num_rows(); 
    } 
    return $query->result_array(); 
} 

现在,你可以把它作为您的要求

//call for only count rows (without limit) 
$this->model_name->get_rows('table_name', TRUE); 

//call with limit for result rows 
$this->model_name->get_rows('table_name'); 
+0

这与问题相去甚远,但我确实喜欢你的get_rows函数。目标是要么同时建立两个不同的查询,要么执行一个,然后改变它的SELECT部分​​并再次运行而没有限制。 –

0

与你可以用查询生成器做到这一点我认为 看看这个代码,你可能想要类似的东西

if($limit != null){ 
     $this->db->limit($limit, $offset); 
    } 
    if($order_by != null){ 
     $this->db->order_by($order_by, $sort); 
    } 

    $query = $this->db->get('courses'); 

    $courses['rows'] = $query->result(); 

    $courses['num_rows'] = $this->db->count_all('courses'); 

    return $courses; 
+0

我不确定这一点,但我想CI只是重新运行相同的查询,但没有限制。这意味着PSQL会为每个字段进行计算。 –