codeigniter活动记录中的子查询

时间:2011-05-18 15:23:06

标签: codeigniter

SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace);

如何在CodeIgniter活动记录中编写上述select语句?

8 个答案:

答案 0 :(得分:80)

->where()支持将任何字符串传递给它,它将在查询中使用它。

你可以试试这个:

$this->db->select('*')->from('certs');
$this->db->where('`id` NOT IN (SELECT `id_cer` FROM `revokace`)', NULL, FALSE);

,NULL,FALSE中的where()告诉CodeIgniter不要转义查询,这可能会搞砸它。

更新:您还可以查看我写的subquery library

$this->db->select('*')->from('certs');
$sub = $this->subquery->start_subquery('where_in');
$sub->select('id_cer')->from('revokace');
$this->subquery->end_subquery('id', FALSE);

答案 1 :(得分:37)

不推荐使用_compile_select()_reset_select()函数 而是使用get_compiled_select()

#Create where clause
$this->db->select('id_cer');
$this->db->from('revokace');
$where_clause = $this->db->get_compiled_select();

#Create main query
$this->db->select('*');
$this->db->from('certs');
$this->db->where("`id` NOT IN ($where_clause)", NULL, FALSE);

答案 2 :(得分:14)

CodeIgniter Active Records当前不支持子查询,但我使用以下方法:

#Create where clause
$this->db->select('id_cer');
$this->db->from('revokace');
$where_clause = $this->db->_compile_select();
$this->db->_reset_select();

#Create main query
$this->db->select('*');
$this->db->from('certs');
$this->db->where("`id` NOT IN ($where_clause)", NULL, FALSE);

_compile_select()和_reset_select()是两个未记录的(AFAIK)方法,它们编译查询并返回sql(不运行它)并重置查询。

在主查询中,where子句中的FALSE告诉codeigniter不要转义查询(或添加反引号等),这会弄乱查询。 (NULL只是因为where子句有一个我们没有使用的可选第二个参数)

但是你应该知道_compile_select()和_reset_select()不是文档化的方法,在将来的版本中可能会出现功能(或存在)的变化。

答案 3 :(得分:1)

对于查询:SELECT * FROM (SELECT id, product FROM product) as product,您可以使用:

$sub_query_from = '(SELECT id, product FROM product ) as product';
$this->db->select();
$this->db->from($sub_query_from);
$query = $this->db->get()

请注意,在sub_query_from字符串中,您必须使用... product ) as...

之间的空格

答案 4 :(得分:0)

$this->db->where('`id` IN (SELECT `someId` FROM `anotherTable` WHERE `someCondition`='condition')', NULL, FALSE);

来源:http://www.247techblog.com/use-write-sub-queries-codeigniter-active-records-condition-full-explaination/

答案 5 :(得分:0)

我认为此代码可行。我不知道这是否是CI中可接受的查询样式,但它在我之前的问题中完美运行。 :)

$subquery = 'SELECT id_cer FROM revokace';

$this->db->select('*');
$this->db->where_not_in(id, $subquery);
$this->db->from('certs');
$query = $this->db->get();

答案 6 :(得分:0)

    $where.= '(';
    $where.= 'admin_trek.trek='."%$search%".'  AND ';
    $where.= 'admin_trek.state_id='."$search".'  OR ';
    $where.= 'admin_trek.difficulty='."$search".' OR ';
    $where.= 'admin_trek.month='."$search".'  AND ';
    $where.= 'admin_trek.status = 1)';

    $this->db->select('*');
    $this->db->from('admin_trek');
    $this->db->join('admin_difficulty',admin_difficulty.difficulty_id = admin_trek.difficulty');
    $this->db->where($where); 
    $query = $this->db->get();

答案 7 :(得分:0)

像这样简单。

    $this->db->select('*');
    $this->db->from('certs');
    $this->db->where('certs.id NOT IN (SELECT id_cer FROM revokace)');

    return $this->db->get()->result();