Я хочу объединить 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')
и это будет работать?
$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, который немного помогает.
Сам запрос не имеет смысла, вы выбираете:
Туве кажется как мужское имя, поэтому выбор пола не нужен. Оле похоже на имя девушки, поэтому выбор пола не только лишний, но и просто не имеет смысла. Ваш запрос вернет любого 12-летнего мужчину по имени Svendson, любого 12-летнего из Индии по имени Svenson, и Tove и Ola Svendson, ЕСЛИ им 12 лет.
Почему бы вам не поставить его между () скобками? По какой-то причине вы хотите сделать это с активной записью?