2012-06-15 381 views
25

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

¿Cómo creo la siguiente consulta usando estrictamente el marco de CI? (puedo crear la consulta fácilmente sin los corchetes, pero entonces 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: Esto es sólo un ejemplo de consulta, incluso si no tiene sentido & No sugiera escribir la totalidad o parte de la consulta dentro de un solo where().

EDIT: Quiero básicamente la aplicación de la siguiente consulta sencilla:

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

Respuesta

35

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(); 
+2

sí esto funcionará y esto es lo que estoy usando actualmente. Pero esto no es estrictamente de manera CI, tengo que escapar de cadenas manualmente. También sospechaba que este tipo de respuesta lo había mencionado en la pregunta 'No sugiera escribir toda la parte OR de la consulta dentro de un solo donde().' – gopi1410

+3

Le pregunté en mi respuesta inicial si tenía alguna razón para lograr esto con registro activo, ya que al definir una consulta dentro de() ES 'estrictamente codificador', simplemente no está activo el registro. De todos modos, esto no es posible dentro de CI ya que no le permitirán hacer consultas anidadas en AR. Hay un generador de cadenas de consulta llamado IgnitedQuery para eso: http://www.assembla.com/wiki/show/IgnitedRecord/IgnitedQuery. –

+0

Esto no funciona para mí. La 2ª condición donde se anula la 1ª condición. CodeIgniter V 2.1.4 – TARKUS

-2

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

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

Tove parece que el nombre de un hombre, por lo que seleccionar el género es innecesaria. 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 quiere ponerlo entre() corchetes? ¿Desea lograrlo con un registro activo por alguna razón?

+0

La consulta es solo de prueba. Al azar escribí lo que se me venía a la mente. Básicamente necesito f1 = v1 Y (f2 = v2 OR f3 = v3) tipo de consultas – gopi1410

+0

y también mi pregunta no era nada sobre la selección, por lo que no es necesario analizar mi consulta – gopi1410

+0

también editó mi pregunta ... espero que lo obtengas ¡hora! – gopi1410

1

Actualmente con CI2 no se puede acceder al método Query Builder ($ this-> db -> _ compile_select()) de la clase de base de datos sin tener que extender la clase base de datos y cambiar el tipo de acceso del método de privado a público/protected, eso mata la capacidad de crear Subquery como si tratara de construir utilizando la clase ActiveRecord. El único método para hacer una sub consulta como la que su tratando de construir sería utilizar sólo 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 un post acerca de hacer esto en CI Subquerys pero está fuera de fecha y sólo funciona en CI 1.7 Espero que ayude un poco.

34

En CodeIgniter 3 hay nuevos métodos group_start() and 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(); 
+0

¿Cuándo se lanzó esta versión?> –

+0

Esta es la manera de hacerlo ahora. +1 –

+0

corrígeme si me equivoco, por favor. ¿Necesita tener un punto y coma en su declaración a excepción de la última? Lo siento nuevo en CI, –

2

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(); 
+0

, parece más fácil que las funciones incorporadas – snAtchnAren

4

Usted puede utilizar esto simplemente

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

también se puede utilizar

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