2016-05-03 12 views
0

ich eine MySQL-Abfrage haben, die dies:Wie implementieren "WHERE NOT IN" Abfrage in Codeigniter Active Datensätze?

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

ich es in Codeigniter Aktive Aufzeichnungen konvertieren wollen, so habe ich den folgenden Code-Segment:

$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; 

Allerdings wirft der Code mir eine Fehler, der wie folgt ist: -

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 

Wie kann ich die oben angegebene Abfrage in Codeigniter Active Records Format konvertieren?

+0

Überprüfen Sie die Tabellennamen es s 'readsave' OR' tbl_readsave' – Saty

+0

actualy Ich habe Tabl Präfix bereits in der database.php Datei. Also 'post' bedeutet 'tbl_post' – Saswat

Antwort

2

$queryReadSave->result_array() gibt ein Array von Arrays zurück. Sie können das nicht in where_not_in verwenden.

Sie müssen Schleife darüber und erstellen Sie eine flache Reihe der IDs, die Sie (wollen) nicht.

$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() existiert nur in PHP 5.5+. Wenn Sie eine niedrigere Version verwenden, müssen Sie Folgendes tun:

P.S. Ihre zweite Tabelle heißt post, oder? Sie müssen die Abfrage aktualisieren, um die richtige Tabelle zu verwenden.

Update: Ihre ursprüngliche Abfrage verwendet eine Unterabfrage, die nicht von CodeIgniter nativ unterstützt wird. Wenn Sie dies alles als eine Abfrage versuchen möchten, können Sie die von mir erstellte Unterabfragenbibliothek verwenden (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

Ausgezeichnet! Es gibt jedoch ein kleines Problem. Angenommen, wir haben keine Daten in 'readsave', dann bekomme ich einen Fehler. Wenn wir keine Daten in 'readsave' haben, sollte der gesamte Post von 'post' Tabelle angezeigt werden. – Saswat

+0

@Saswat: Dann überprüfe, ob '$ queryReadSave-> num_rows()> 0' ist und füge nur' 'where_not_in' 'hinzu, wenn das' 'true'' ist. –

+0

OK .... Aber wenn ich die ursprüngliche Abfrage wie $ this-> db-> Abfrage schreiben ("SELECT * FROM tbl_post WHERE tbl_post.post_id NICHT IN (SELECT tbl_readsave.post_id FROM tbl_readsave)") Ich bekomme erwartet Ergebnis ... Kann es nicht mit AR implementiert werden. – Saswat

1

try unten Code:

$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;