【发布时间】:2011-08-28 04:14:28
【问题描述】:
SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace);
如何在CodeIgniter活动记录中编写上面的select语句?
【问题讨论】:
标签: codeigniter
SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace);
如何在CodeIgniter活动记录中编写上面的select语句?
【问题讨论】:
标签: codeigniter
->where() 支持将任何字符串传递给它,它会在查询中使用它。
你可以试试这个:
$this->db->select('*')->from('certs');
$this->db->where('`id` NOT IN (SELECT `id_cer` FROM `revokace`)', NULL, FALSE);
where() 中的 ,NULL,FALSE 告诉 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);
【讨论】:
函数 _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);
【讨论】:
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() 没有记录在案的方法,因此功能(或存在)可能会在未来的版本中发生变化。
【讨论】:
_compile_select() 未被弃用。由于未知的原因,从 CI 2.1.0 开始,它是一个受保护的函数(在 system/database/DB_active_rec.php 中),这意味着您不能使用它,除非您从函数声明中删除“受保护”子句(但始终是小心修改核心)。
_compile_select。它的 CI 显然是 2.0.1 版。该方法用于 EE 2.7 本身引入的功能中,所以我想它暂时不会有任何进展,否则他们会想出一个解决方法(例如另一个答案中的 get_compiled_select 方法)。
最初的问题可能有点晚,但对于未来的查询,这可能会有所帮助。 实现这一目标的最佳方法是 将内部查询的结果获取到这样的数组中
$this->db->select('id');
$result = $this->db->get('your_table');
return $result->result_array();
然后在下面的活动记录子句中使用比数组
$this->db->where_not_in('id_of_another_table', 'previously_returned_array');
希望对你有帮助
【讨论】:
以简单的方式喜欢这个。
$this->db->select('*');
$this->db->from('certs');
$this->db->where('certs.id NOT IN (SELECT id_cer FROM revokace)');
return $this->db->get()->result();
【讨论】:
查询: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... 之间必须使用空格
【讨论】:
我认为这段代码会起作用。我不知道这是否是 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();
【讨论】:
$this->db->where('`id` IN (SELECT `someId` FROM `anotherTable` WHERE `someCondition`='condition')', NULL, FALSE);
【讨论】:
$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();
【讨论】: