我想在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部分。
EDIT:基本上,我想执行以下简单查询:
SELECT * FROM `table` WHERE field1='value1' AND (field2='value2' OR field3='value3')
这会起作用吗?
$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();
在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();
您可以简单地使用它
$this->db->where("status","live")->or_where("status","dead");
您也可以使用
$this->db->where("(status='live' OR status='dead')");
在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();
使用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();
尝试使用Query grouping
链接
http://www.codeigniter.com/userguide3/database/query_builder.html#query-grouping
当前使用CI2,如果不扩展Database类并将该方法的访问类型从private更改为public / protected,将无法访问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希望能有所帮助。
我为CodeIgniter 2需要这个,但是我仍然需要转义这些值,所以csotelo's answer对我不利,并且我不想像Shawn C's answer一样重写整个查询,所以我最终这样做:] >
$CI->db->where('LastName', $lastName); $CI->db->where('Age', $age, false); $CI->db->where('1 AND ( 0', null, false); // This one starts the group $CI->db->or_where('FirstName', $firstName1); $CI->db->or_where('FirstName', $firstName2); $CI->db->or_where('Gender', $gender); $CI->db->or_where('Country', $country); $CI->db->or_where('0 )', null, false); // This one ends the group $query = $CI->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)
查询本身没有意义,您正在选择: