2013-02-20 55 views
1

如何以Codeigniter風格編寫以下查詢。以codeigniter風格編寫聯合查詢

SELECT COUNT(`id`) AS reccount 
    FROM 
    (SELECT `id` FROM table1 
    WHERE tid= '101' AND `status` = 1 
    UNION ALL 
    SELECT `id` FROM table2 
    WHERE tid= '101' AND `status` = 1 
    UNION ALL 
    SELECT `id` FROM table3 
    WHERE tid= '101' AND `status` = 1) t 

我用下面的方法來執行它。

這是唯一正確的方法還是您有任何改進建議?

$q = $this->db->query(SELECT COUNT(`id`) AS reccount 
         FROM 
         (SELECT `id` FROM table1 
         WHERE tid= '101' AND `status` = 1 
         UNION ALL 
         SELECT `id` FROM table2 
         WHERE tid= '101' AND `status` = 1 
         UNION ALL 
         SELECT `id` FROM table3 
         WHERE tid= '101' AND `status` = 1) t "); 
+0

可能重複http://stackoverflow.com/questions/2040655/ union-query-with-codeigniters-active-record-pattern) – 2014-09-30 19:19:44

回答

-1
function get_merged_result($ids){     
    $this->db->select("column"); 
    $this->db->distinct(); 
    $this->db->from("table_name"); 
    $this->db->where_in("id",$model_ids); 
    $this->db->get(); 
    $query1 = $this->db->last_query(); 

    $this->db->select("column2 as column"); 
    $this->db->distinct(); 
    $this->db->from("table_name"); 
    $this->db->where_in("id",$model_ids); 

    $this->db->get(); 
    $query2 = $this->db->last_query(); 
    $query = $this->db->query($query1." UNION ".$query2); 

    return $query->result(); 
} 
+0

在這裏,你正在運行2個查詢只是爲了獲得SQL輸出並將它們與union結合起來?不妨像OP那樣在第一時間寫出查詢。 – dakdad 2013-02-20 12:24:07

+1

Nop,你可以通過閱讀這篇文章得到更多的細節,http://codesamplez.com/database/codeigniter-activerecord – Shaolin 2013-02-20 12:30:13

+1

問題是,'$ this-> db-> get();'是要執行查詢。因此,您正在運行2個查詢,只是爲了獲得第三個SQL語句!你可以把它寫成一個字符串並傳遞給'$ this-> db-> query($ sql);'函數。 – dakdad 2013-02-21 00:16:59

1

您可以使用CI生成一個聯合查詢。但是,最新版本比以前更加困難。

DB有一個名爲_compile_select的方法,在以前的CI版本中它是公開的,但是現在它受到保護,因此您不能從控制器調用$this->db->_compile_select()。爲了正確地做到這一點人們可以:

  1. 創建自定義的類裝載器,以便能夠擴展核心/數據庫類(即負載MY_DB_active_record代替CI_DB_active_record)。
  2. 創建自定義的ActiveRecord類,只有一個方法:

    public function compile_select() { 
        return $this->_compile_select(); 
    } 
    
  3. 在你的控制器,創造一切必要的查詢,使用我們的公共方法編譯成一個字符串數組compile_select()

  4. 陣列加入到單個查詢:'(' . implode(') UNION (', $queries) . ')'。您也可以將其封裝到自定義AR類中的單獨方法中。
13

由於CodeIgniter 3在Active Record中引入了函數get_compiled_select(),該函數在不實際執行查詢的情況下給出查詢字符串。

這允許@MDeSilva方法使用更少的資源,被適配爲:

function get_merged_result($ids){     
    $this->db->select("column"); 
    $this->db->distinct(); 
    $this->db->from("table_name"); 
    $this->db->where_in("id",$model_ids); 
    $query1 = $this->db->get_compiled_select(); // It resets the query just like a get() 

    $this->db->select("column2 as column"); 
    $this->db->distinct(); 
    $this->db->from("table_name"); 
    $this->db->where_in("id",$model_ids); 
    $query2 = $this->db->get_compiled_select(); 

    $query = $this->db->query($query1." UNION ".$query2); 

    return $query->result(); 
} 
[UNION與笨的活動記錄圖案查詢](的
+0

如果你打算使用這個,請確保你的表格列都是相同的序列和名稱。 – 2017-08-24 06:04:02