subconsulta en el registro activo codeigniter

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

¿Cómo escribo la statement de selección anterior en el registro activo de CodeIgniter?

->where() soporta pasarle una cadena y la usará en la consulta.

Puedes intentar usar esto:

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

El ,NULL,FALSE en el where() le dice a CodeIgniter que no debe escapar de la consulta, lo que puede estropearla.

ACTUALIZACIÓN : También puede consultar la biblioteca de subconsulta que escribí.

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

Las funciones _compile_select() y _reset_select() están en desuso.
En su lugar, use 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); 

Los registros activos de CodeIgniter actualmente no admiten subconsultas. Sin embargo, uso el siguiente enfoque:

 #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 () y _reset_select () son dos métodos no documentados (AFAIK) que comstackn la consulta y devuelven el sql (sin ejecutarlo) y restablecen la consulta.

En la consulta principal, FALSO en la cláusula where indica a Codeigniter que no debe escapar de la consulta (o añadir pausas, etc.) lo que estropearía la consulta. (El NULL es simplemente porque la cláusula where tiene un segundo parámetro opcional que no estamos usando)

Sin embargo, debe tener en cuenta que _compile_select () y _reset_select () no son métodos documentados, es posible que su funcionalidad (o existencia) pueda cambiar en versiones futuras.

Puede ser un poco tarde para la pregunta original, pero para consultas futuras esto podría ayudar. La mejor forma de lograr esto es obtener el resultado de la consulta interna en una matriz como esta

 $this->db->select('id'); $result = $this->db->get('your_table'); return $result->result_array(); 

Y luego use que array en la siguiente cláusula de registro activo

 $this->db->where_not_in('id_of_another_table', 'previously_returned_array'); 

Espero que esto ayude

Para consulta: SELECT * FROM (SELECT id, product FROM product) as product que puede usar:

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

Tenga en cuenta que en sub_query_from string debe usar espacios entre ... product ) as...

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

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

Creo que este código funcionará No sé si este es un estilo de consulta aceptable en CI, pero funciona perfectamente en mi problema anterior. 🙂

 $subquery = 'SELECT id_cer FROM revokace'; $this->db->select('*'); $this->db->where_not_in(id, $subquery); $this->db->from('certs'); $query = $this->db->get(); 
  $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();