2013-02-19 65 views
1

我有一個嵌套的SQL查詢如下。將嵌套mysql查詢轉換爲codeigniter風格

SELECT A.ID, A.fName, A.lName, 
    COALESCE (B.calls, 0) AS Calls 
FROM TableA AS A 
    LEFT JOIN 
    (
     SELECT COUNT(B.event) AS Calls, B.ID 
     FROM TableB AS B 
     WHERE B.event LIKE 'call' 
     AND `Time` >= 1360540800 
     AND `Time` <= 1361232000 
     GROUP BY B.ID 

    ) B 
     ON A.ID = B.ID 
WHERE A.State LIKE 'SENT' OR A.State LIKE 'SET' 

我想將它轉換爲codeigniter風格。我知道Code Igniter的Active Record類本身不支持子查詢。但是,這怎麼能做到。我一直在嘗試下面的代碼。 所以我做了兩個不同的查詢和使用如下工會將它們結合在一起:

$query = $this->db->query("select * from $subQuery2 UNION $subQuery1 as unionTable "); 

聯盟是不正確的做法,能不能幫我幫我把它轉換成笨風格。

回答

0

你可以使用codeigniter的子查詢方式來做到這一點,你將不得不破解codeigniter。這樣 進入系統/數據庫/ DB_active_rec.php從這些功能

public function _compile_select($select_override = FALSE) 
public function _reset_select() 

在現已子查詢書寫刪除公共或受保護的關鍵字,現在這裏是有活動記錄查詢

$data = array(
       'COUNT(B.event) AS Calls', 
       'B.ID' 
      ); 

$this->db 
     ->select($data) 
     ->from('TableB AS B') 
     ->like('B.event','call','both') 
     ->where('`Time` >=',1360540800) 
     ->where('`Time` <=',1361232000) 
     ->group_by('B.ID'); 

$subQuery = $this->db->_compile_select(); 
$this->db->_reset_select(); 
unset($data); 
$data = array(
       'A.ID', 
       'A.fName', 
       'A.lName', 
       'COALESCE (B.calls, 0) AS Calls' 
      ); 
$this->db 
     ->select($data) 
     ->from('TableA AS A') 
     ->join("$subquery") 
     ->like('A.State','SENT','both') 
     ->or_like('A.State','SET','both'); 

我有把兩者都放在你可以根據你的要求做的事情上。 注意:使用子查詢,您必須使用

$this->db->from('myTable') 

代替

$this->db->get('myTable') 

它運行查詢。