combinación de mysql Y consultas OR en Codeigniter


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

¿Cómo puedo crear 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") 

P.D.: Esto es solo una consulta de ejemplo, incluso si no tiene sentido y No sugiera escribir la totalidad O parte de la consulta dentro de un único where().

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

SELECT * FROM `table` WHERE field1='value1' AND (field2='value2' OR field3='value3') 
Author: gopi1410, 2012-06-15

8 answers

¿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();
 40
Author: csotelo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-15 19:17:14

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();
 37
Author: gadelat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-07 10:46:07

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')");
 4
Author: Waseem shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-08 19:49:03
 2
Author: Jatin Raikwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-16 05:50:14

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();
 2
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-07 06:27:18

Actualmente con CI2 no puede acceder al método Query Builder (this this->db->_compile_select() ) de la clase de Base de datos sin extender la clase de base de datos y cambiar el tipo de acceso del método de privado a público/protegido, lo que elimina la capacidad de compilar Subconsultas como si intentara compilar usando la clase ActiveRecord. El único método para hacer una subconsulta como la que intenta compilar sería usar el método de consulta de base de datos

$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 entrada de blog sobre hacer esto en CI Subquerys pero está desactualizado y solo funciona en CI 1.7 Hope que ayuda un poco.

 1
Author: Shawn C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-30 20:24:17

Usando codeigniter 3.0 frame work,hay una nueva característica disponible para operación separada o donde y donde.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();
 1
Author: Sherin Green,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-22 16:52:44

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

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

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

¿Por qué no quieres ponerlo entre corchetes ()? ¿Quieres lograrlo con active record por alguna razón?

 -3
Author: Dirk de Man,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-15 18:47:38