33

我想在 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") 

PS:这只是一个示例查询,即使它没有意义也不建议将查询的整个 OR 部分写在单个where().

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

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

9 回答 9

49

在 CodeIgniter 3 中有新的方法group_start() 和 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();
于 2014-07-17T20:31:30.350 回答
48

这行得通吗?

$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();
于 2012-06-15T19:17:14.680 回答
4

使用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();
于 2018-05-22T16:52:44.837 回答
3

在 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();
于 2016-09-15T03:13:36.900 回答
3

您可以简单地使用它

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

你也可以使用

$this->db->where("(status='live' OR status='dead')");
于 2017-01-08T19:49:03.400 回答
2

尝试使用Query grouping

给它链接

http://www.codeigniter.com/userguide3/database/query_builder.html#query-grouping

于 2016-11-16T05:50:14.093 回答
1

目前使用 CI2,如果不扩展 Database 类并将方法的访问类型从私有更改为公共/受保护,则无法访问 Database 类的查询生成器方法 ($this->db->_compile_select() ),这会破坏该能力构建子查询就像您尝试使用 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 希望能有所帮助。

于 2012-09-30T17:01:24.860 回答
0

CodeIgniter 2 我需要这个,但我需要的值仍然被转义,所以csotelo 的答案对我不利,我不想像Shawn C 的答案那样重写整个查询,所以我最终这样做了:

$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)
于 2020-05-15T17:50:09.443 回答
-3

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

  • 托芙·斯文森,12 岁
  • 奥拉·斯文森,12 岁
  • 任何名叫斯文森的男性,12 岁
  • 任何 12 岁的印度人 Svendson

Tove 看起来像一个男人的名字,所以选择性别是不必要的。Ola 看起来像一个女孩的名字,所以选择性别不仅没有必要,而且没有任何意义。您的查询将返回任何名为 Svendson 的 12 岁男性、任何来自印度的名为 Svenson 的 12 岁男性以及 Tove 和 Ola Svendson(如果他们 12 岁)。

你为什么不想把它放在 () 括号之间?出于某种原因,您想通过活动记录来完成它吗?

于 2012-06-15T18:47:38.293 回答