2016-05-03 74 views
0

我有一個MySQL查詢是這樣的:如何在Codeigniter Active記錄中實現「WHERE NOT IN」查詢?

SELECT * FROM tbl_post WHERE tbl_post.post_id NOT IN 
(SELECT tbl_readsave.post_id FROM tbl_readsave) 

我想把它轉換成笨的活動記錄,所以我用下面的代碼段:

$this->db->select('tbl_readsave.post_id'); 
    $queryReadSave = $this->db->get('readsave'); 
    $this->db->where_not_in('post_id', $queryReadSave->result_array()); 
    $queryNewPost = $this->db->get('readsave'); 
    if($queryNewPost->num_rows()>0) 
    { 
     return $queryNewPost->result_array(); 
    } 
    else 
     return false; 

但是,代碼拋出我的錯誤,如下所示: -

Error Number: 1054 

Unknown column 'Array' in 'where clause' 

SELECT * FROM (`tbl_readsave`) WHERE `post_id` NOT IN (Array) 

Filename: /var/www/html/teamF/tharjumal/models/webservice_model.php 

Line Number: 28 

如何將上述查詢轉換爲Codeigniter Active Records格式?

+0

檢查它是你的表名'readsave'或已經database.php中文件'tbl_readsave' – Saty

+0

actualy我已經設置TBL前綴。所以'後'的意思是'tbl_post' – Saswat

回答

2

$queryReadSave->result_array()返回一個數組數組。您不能在where_not_in中使用該功能。

您需要循環,並創建一個平面數組(您不需要)。

$this->db->select('post_id'); 
$queryReadSave = $this->db->get('readsave'); 

$postIDs = $queryReadSave->result_array(); 

$this->db->where_not_in('post_id', array_column($postIDs, 'post_id')); 
$queryNewPost = $this->db->get('post'); 

array_column()只存在於PHP 5.5+。如果您的版本較低,則需要執行以下操作:

$this->db->select('post_id'); 
$queryReadSave = $this->db->get('readsave'); 

$postIDs = array_map(function($a){ 
    return $a['post_id']; 
}, $queryReadSave->result_array()); 

$this->db->where_not_in('post_id', $postIDs); 
$queryNewPost = $this->db->get('post'); 

P.S.你的第二張表叫做post,對嗎?您需要更新查詢才能使用正確的表格。

更新:您的原始查詢使用子查詢 CodeIgniter本機不支持此查詢。如果您想將這一切全部作爲一個查詢來使用,則可以使用我創建的子查詢庫(https://github.com/NTICompass/CodeIgniter-Subqueries)。

$this->db->select('*'); 
$this->db->from('post'); 

$sub = $this->subquery->start_subquery('where_in'); 
$sub->select('post_id')->from('readsave'); 

$this->subquery->end_subquery('post_id', FALSE); 
$queryNewPost = $this->db->get(); 
+0

非常好!但是有一個小問題。假設我們在'readsave'中沒有數據,那麼我得到錯誤。如果我們在'readsave'中沒有數據,則應顯示'post'表中的所有帖子。 – Saswat

+0

@Saswat:然後檢查'$ queryReadSave-> num_rows()> 0'是否只添加'where_not_in',如果是'true'。 –

+0

OK ....但是,如果我寫的原始查詢像$ this-> db-> query(「SELECT * FROM tbl_post WHERE tbl_post.post_id NOT IN (SELECT tbl_readsave.post_id FROM tbl_readsave)」)我得到預期的結果...不能用AR來實現。 – Saswat

1

試試下面的代碼:

$read_post_id = []; 

$queryReadSave = $this->db->select('post_id')->get('tbl_readsave')->result_array(); 

if(count($queryReadSave) > 0){ 

    foreach($queryReadSave as $row){ 

     $read_post_id[] = $row['post_id']; // add each post id to the array 
    } 

} 

$this->db->select('*'); 

if(!empty($read_post_id)) $this->db->where_not_in('post_id',$read_post_id); 

$post = $this->db->get('tbl_post'); 

print_r($post->result_array()); 

exit;