如何在Codeigniter Active记录中实现“WHERE NOT IN”查询?

时间:2016-05-03 14:00:54

标签: php mysql codeigniter

我有一个MySQL查询:

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

我想将其转换为Codeigniter Active记录,因此我使用了以下代码段:

    $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格式?

2 个答案:

答案 0 :(得分:2)

$queryReadSave->result_array()返回一个数组数组。您无法在where_not_in中使用它。

您需要循环并创建一个您不想要的ID的平面数组。

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

答案 1 :(得分:1)

尝试以下代码:

5*4*2