2013-01-10 154 views
5

有可能產生由CI查詢生成器類下面的查詢?笨JOIN(SELECT查詢

SELECT name 
     FROM table1 t1 
        JOIN 
        (SELECT ID FROM table2 ORDER BY id LIMIT 5) t2 
        ON t2.id=t1.t2_id 
     WHERE t1.id>5 

回答

15

那麼有幾個做的方式,一種方式是在這裏是一個黑客攻擊。

How can I rewrite this SQL into CodeIgniter's Active Records?

這另一種方法是非常簡單的。

$this->db 
     ->select('ID') 
     ->from('table2') 
     ->order_by('id') 
     ->limit('5'); 

$subquery = $this->db->_compile_select(); 

$this->db->_reset_select(); 

$query =  $this->db 
        ->select('t1.name') 
        ->from('table1 t1 ') 
        ->join("($subquery) t2","t2.id = t1.t2_id") 
        ->get('table1 t1'); 

有些觀點。
您必須在子查詢中使用from子句,因爲get會運行查詢。
在codeigniter 2中_compile_select和_reset_select不能被訪問,因爲它們是受保護的方法。
您可能必須在system/database/DB_active_rec.php中的兩種方法之前刪除關鍵字

This文章也很有用。

+0

我問** CI查詢生成器**不生查詢,我可以運行原始查詢O'C, –

+0

好吧,我已經加你還沒有看到他們告訴究竟是如何做到這兩篇文章的鏈接。一個是我自己的答案。小心一看? –

+0

以及爲什麼你把這個更糟的答案呢?第二個鏈接看起來不錯,可能是這樣做的最好方法 –

0

這個庫可以幫助您使用子查詢與查詢生成器對這個庫的文檔看

sub query with query builder

+0

如果它爲'group_start實施將是有益的()' –

+0

也可以此功能通過CI查詢生成器類添加到這個庫,並在GitHub上的開發者共享將成爲其他開發商太有用 – umefarooq

+0

將盡時,我得到了一個時間,知道CI超過現在 –

1

在CI3,只需使用第四個參數逃生

$this->db->from('table') 
->join('SELECT id from table2 where something=%s) as T2'),'table.id=T2.id', 'LEFT',NULL) 
->get()->row(); 

不要忘記在子查詢中轉義參數以避免SQL注入。

+0

** ** –