2016-05-03 14 views
0

私はこれでMySQLのクエリがあります。Codeigniterアクティブレコードに "WHERE NOT IN"クエリを実装する方法は?

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

を私はCodeIgniterのアクティブレコードにそれを変換したいので、私は次のコードセグメントを使用:

$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' OR' tbl_readsave' – Saty

+0

がactualy私はすでにdatabase.phpでファイルにTBL接頭辞を設定していますよ。だから「投稿」は「tbl_post」を意味する – Saswat

答えて

2

$queryReadSave->result_array()は配列の配列を返します。 where_not_inには使用できません。

これ以上のものをループする必要があります。あなたが望んでいないIDのフラットな配列を作成する必要があります。

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.あなたの2番目のテーブルはpostといいますか?適切なテーブルを使用するようにクエリを更新する必要があります。

更新:元のクエリでは、サブクエリが使用されていますが、これはCodeIgniterでネイティブにサポートされていません。このすべてを1つのクエリとして試したい場合は、作成したサブクエリライブラリを使用できます(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'をチェックし、' true'なら 'where_not_in'だけを追加します。 –

+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; 
関連する問題