2013-03-14 98 views
2

如何將左連接轉換包含select到codeigniter的sql方法?謝謝。我只是想知道。codeigniter mysql左連接include選擇

SELECT c1.c1_id, c1.c1_name, c2.c2_id, c2.c2_name, c2.c2_type, c2.c2_status, f.f_id, f.f_name, f2.f2_id, f2.f2_name FROM category2 c2 
LEFT JOIN category1 c1 ON c1.c1_id = c2.c1_id 
LEFT JOIN (
    SELECT DISTINCT c2_id, f_id, f_name FROM file ORDER BY f_id DESC 
) f ON f.c2_id = c2.c2_id 
LEFT JOIN (
    SELECT DISTINCT c2_id, f2_id, f2_name FROM file2 ORDER BY f2_id DESC 
) f2 ON f2.c2_id = c2.c2_id 
WHERE c2.c2_status = 1 
GROUP BY c2.c2_id 

回答

2

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

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

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

$select = array('DISTINCT c2_id','f_id','f_name'); 
$this->db->select($select); 
$this->db->from('file'); 
$this->db->order_by('f_id','DESC'); 
$subQuery1 = $this->db->_compile_select(); 

unset($select); 

$this->db->_reset_select(); 

$select = array('DISTINCT c2_id','f_id','f2_name'); 
$this->db->select($select); 
$this->db->from('file2'); 
$this->db->order_by('f2_id','DESC'); 
$subQuery2 = $this->db->_compile_select(); 

unset($select); 

$this->db->_reset_select(); 

// And now your main query 

$select = array(
        'c1.c1_id', 
        'c1.c1_name', 
        'c2.c2_id', 
        'c2.c2_name', 
        'c2.c2_type', 
        'c2.c2_status', 
        'f.f_id', 
        'f.f_name', 
        'f2.f2_id', 
        'f2.f2_name' 
      ); 

$this->db->select($select); 
$this->db->from('category2 c2'); 
$this->db->join("($subQuery1)",'f.c2_id = c2.c2_id','left'); 
$this->db->join("($subQuery2)",'f2.c2_id = c2.c2_id','left'); 
$this->db->where('c2.c2_status',1); 
$this->db->group_by('c2.c2_id'); 
$main_query = $this->db->get(); 

而且查詢事情完成了。乾杯!!! 注意:使用子查詢,您必須使用

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

代替

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

它運行查詢。現在

,您可以檢查已建成

echo $this->db->last_query(); 
查詢
0
$query='SELECT c1.c1_id, c1.c1_name, c2.c2_id, c2.c2_name, c2.c2_type, c2.c2_status, f.f_id, f.f_name, f2.f2_id, f2.f2_name FROM category2 c2 
LEFT JOIN category1 c1 ON c1.c1_id = c2.c1_id 
LEFT JOIN (
    SELECT DISTINCT c2_id, f_id, f_name FROM file ORDER BY f_id DESC 
) f ON f.c2_id = c2.c2_id 
LEFT JOIN (
    SELECT DISTINCT c2_id, f2_id, f2_name FROM file2 ORDER BY f2_id DESC 
) f2 ON f2.c2_id = c2.c2_id 
WHERE c2.c2_status = ? 
GROUP BY c2.c2_id'; 
$params=array(); 
$params[]=1; 
$result=$this->db->query($query,$params); 
$result=$result->result_array(); 
print_r($result); 

我會避免使用笨的Active Record類,除非你的目標是混淆你的代碼。

「總是編碼,就好像最終維護你的代碼的人是一個暴力的精神病患者,他知道你住在哪裏。」