query inner example error php mysql codeigniter codeigniter-2

php - inner - combinando consultas mysql Y o en Codeigniter



query codeigniter example (8)

Quiero combinar Y O consultas de mysql en CI. Ya he visto este hilo: http://codeigniter.com/forums/viewthread/92818/ . Pero no proporcionan la solución exacta allí.

¿Cómo creo la siguiente consulta usando estrictamente el marco de CI? (Puedo crear la consulta fácilmente sin los corchetes, pero no es la misma consulta).

SELECT * FROM `Persons` WHERE LastName=''Svendson'' AND Age="12" AND (FirstName=''Tove'' OR FirstName=''Ola'' OR Gender="M" OR Country="India")

PD: Esta es solo una consulta de muestra, incluso si no tiene sentido. No sugiera escribir la totalidad de la parte O de la consulta dentro de un solo where() .

EDITAR: Básicamente quiero la implementación de la siguiente consulta simple:

SELECT * FROM `table` WHERE field1=''value1'' AND (field2=''value2'' OR field3=''value3'')


Actualmente con CI2 no puede acceder al método Query Builder ($ this-> db -> _ compile_select ()) de la clase Database sin ampliar la clase Database y cambiar el tipo de acceso del método de private a public / protected, que mata la capacidad para construir Subquery como si tratara de construir utilizando la clase ActiveRecord. El único método para hacer una subconsulta como la que intentas construir sería simplemente usar el método de consulta db

$table = $this->db->dbprefix(''tablename''); $sql = "SELECT * FROM `{$table}` WHERE field1=''?'' AND (field2=''?'' OR field3=''?'') "; $this->db->query($sql,array($field1,$field2,$field3));

Hubo una publicación en el blog sobre cómo hacer esto en CI Subquerys, pero está desactualizada y solo funciona en CI 1.7 Espero que ayude un poco.


En CodeIgniter 3 hay nuevos métodos group_start () y group_end () que sirven exactamente para este propósito.

return $this->db ->where(''LastName'', ''Svendson''); ->where(''Age'', 12); ->group_start() ->where(''FirstName'',''Tove'') ->or_where(''FirstName'',''Ola'') ->or_where(''Gender'',''M'') ->or_where(''Country'',''India'') ->group_end() ->get(''Persons'') ->result();


En Codeigniter podemos usarlo así de fácil de entender.

$sql = "SELECT * FROM `Persons` WHERE LastName = ''Svendson'' AND Age = ''12'' AND ( FirstName = ''Tove'' OR FirstName = ''Ola'' OR Gender = ''M'' OR Country = ''India'' )"; $query = $this->db->query($sql); return $query->result();



La consulta en sí misma no tiene sentido, estás seleccionando:

  • Tove Svendson, 12 años
  • Ola Svendsen, 12 años
  • cualquier hombre llamado Svendson, 12 años
  • cualquier persona de India llamada Svendson, 12 años

Tove parece el nombre de un hombre, por lo que no es necesario seleccionar el género. Ola parece ser el nombre de una niña, por lo que seleccionar el género no solo es innecesario, sino que simplemente no tiene sentido. Su consulta devolverá a cualquier hombre de 12 años llamado Svendson, cualquier niño de 12 años de India llamado Svenson, y Tove y Ola Svendson, SI tienen 12 años.

¿Por qué no quieres ponerlo entre () corchetes? ¿Desea lograrlo con un registro activo por alguna razón?


Puedes usar esto simplemente

$this->db->where("status","live")->or_where("status","dead");

también puedes usar

$this->db->where("(status=''live'' OR status=''dead'')");


usando codeigniter 3.0 frame work, hay una nueva función disponible para operaciones separadas, dónde y dónde. es decir, group by y group end

código como,

$this->db->where(''LastName'', ''Svendson''); $this->db->where(''Age'', 12); $this->db->group_start(); $this->db->or_where(''FirstName'',''Tove''); $this->db->or_where(''FirstName'',''Ola''); $this->db->or_where(''Gender'',''M''); $this->db->or_where(''Country'',''India''); $this->db->group_end(); $query = $this->db->get(''Persons''); return $query->result();


y esto funcionará?

$this->db->where(''LastName'', ''Svendson''); $this->db->where(''Age'', 12); $this->db->where("(FirstName=''Tove'' OR FirstName=''Ola'' OR Gender=''M'' OR Country=''India'')", NULL, FALSE); $query = $this->db->get(''Persons''); return $query->result();