Подтвердить что ты не робот

Объединение запросов 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") 

P.S.: Это просто примерный запрос, даже если он не имеет смысла, и не предлагайте писать всю OR часть запроса внутри одного where().

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 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();

Ответ 5

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

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

вы также можете использовать

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

Ответ 6

В настоящее время с 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. Надеюсь, что это поможет.

Ответ 7

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

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

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

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