在Codeigniter中组合mysql和OR查询

时间:2012-06-15 18:30:43

标签: php mysql codeigniter codeigniter-2

我想在CI中组合AND OR mysql查询。我已经看过这个帖子:http://codeigniter.com/forums/viewthread/92818/。 但他们并没有在那里提供确切的解决方案。

如何使用严格的CI框架创建以下查询?(我可以轻松地创建查询而不使用括号,但它不是相同的查询。)

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

P.S。:这只是一个示例查询,即使它没有意义&不建议在单个where()内编写查询的整个OR部分。

编辑:基本上我想要实现以下简单查询:

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

9 个答案:

答案 0 :(得分:40)

这会有用吗?

$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();

答案 1 :(得分:40)

在CodeIgniter 3中,有一些新方法group_start() and group_end()完全可以用于此目的。

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

答案 2 :(得分:4)

您可以简单地使用

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

您也可以使用

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

答案 3 :(得分:3)

使用codeigniter 3.0框架工作,有新的功能可用于单独或在哪里和哪里操作。即分组依据和组结束

代码,

$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();

答案 4 :(得分:2)

在Codeigniter中我们可以这样使用它很容易理解。

$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();

答案 5 :(得分:2)

答案 6 :(得分:1)

目前使用CI2,您无法访问Database类的查询构建器方法($ this-> db-> _compile_select()),而无需扩展Database类并更改方法的访问类型从私有到公共/受保护,这会破坏构建子查询的能力,就像您尝试使用ActiveRecord类构建一样。制作像你试图构建的子查询的唯一方法是使用db查询方法

$table = $this->db->dbprefix('tablename');

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

有一篇关于在CI Subquerys执行此操作的博文,但它已过时且仅适用于CI 1.7希望有所帮助。

答案 7 :(得分:0)

我需要CodeIgniter 2的代码,但是我仍然需要保留值,所以csotelo's answer对我来说并不好,并且我不想像Shawn C's answer一样重写整个查询,所以我结束了这样做:

$this->db->where('LastName', $lastName);
$this->db->where('Age', $age, false);
$this->db->where('1 AND ( 0', null, false); // This one starts the group
  $this->db->or_where('FirstName', $firstName1);
  $this->db->or_where('FirstName', $firstName2);
  $this->db->or_where('Gender', $gender);
  $this->db->or_where('Country', $country);
$this->db->or_where('0 )', null, false); // This one ends the group
$query = $this->db->get('Persons');

哪个生成以下查询:

SELECT *
FROM (`Persons`)
WHERE `LastName` =  'Svendson'
AND Age = 12
AND 1 AND ( 0 -- This one starts the group
OR `FirstName` =  'Tove'
OR `FirstName` =  'Ola'
OR `Gender` =  'M'
OR `Country` =  'India'
OR 0 ) -- This one ends the group

与此相同:

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

答案 8 :(得分:-3)

查询本身没有意义,您选择:

  • Tove Svendson,12岁
  • Ola Svendsen,12岁
  • 任何男性名叫Svendson,12岁
  • 来自印度的任何人,名叫Svendson,12岁
托夫似乎是一个男人的名字,所以选择性别是不必要的。 Ola看起来像女孩的名字,所以选择性别不仅是不必要的,而且只是没有意义。您的查询将返回任何12岁男性名为Svendson,任何12岁的印度人,名为Svenson,Tove和Ola Svendson,如果他们已经12岁。

为什么不把它放在()括号之间?你是否想出于某种原因用活跃的记录完成它?