объединение запросов mysql AND OR в Codeigniter

Я хочу объединить AND и mysql-запросы в CI. Я уже видел эту тему: 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() .

EDIT: В основном я хочу реализовать следующий простой запрос:

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

Solutions Collecting From Web of "объединение запросов mysql AND OR в Codeigniter"

и это будет работать?

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

Попробуйте использовать Query grouping

Ссылка для этого

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

Вы можете использовать это просто

 $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(); , является $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(); 

В настоящее время с CI2 вы не можете получить доступ к методу Query Builder ($ 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 Hope, который немного помогает.

Сам запрос не имеет смысла, вы выбираете:

  • Tove Svendson, 12 лет
  • Ола Свендсен, 12 лет
  • любой мужчина по имени Свендсон, 12 лет
  • любой человек из Индии по имени Свендсон, 12 лет

Туве кажется как мужское имя, поэтому выбор пола не нужен. Оле похоже на имя девушки, поэтому выбор пола не только лишний, но и просто не имеет смысла. Ваш запрос вернет любого 12-летнего мужчину по имени Svendson, любого 12-летнего из Индии по имени Svenson, и Tove и Ola Svendson, ЕСЛИ им 12 лет.

Почему бы вам не поставить его между () скобками? По какой-то причине вы хотите сделать это с активной записью?