Codeigniter передает выходные данные выбора в предложение IN другого выбора, используя подзапросы - PullRequest
0 голосов
/ 08 декабря 2018

Я хочу воспользоваться самозащитой Active Records в Codeigniter.

Требование:

  1. Получить некоторые серийные номера из первой таблицы на основе некоторых критериев
  2. Затем проверить, какие из этих серийных номеров присутствуют во второй таблице на основенекоторые сложные критерии.
  3. Наконец, показывают результаты из первой таблицы, которых нет во втором наборе результатов таблицы.

У меня есть следующий код в CI:

$this->db->select('sno');
$this->db->from('table1');
$this->db->where("cid",$cid);
$subquery=$this->db->get_compiled_select();

$this->db->select("pid")->from("table2");
$this->db->group_start();
    $this->db->group_start();
        $this->db->where("col1 <",$cin);
        $this->db->where("col2 >",$cin);
    $this->db->group_end();
    $this->db->or_group_start();
        $this->db->where("col1 <",$cout);
        $this->db->where("col2 >",$cout);
    $this->db->group_end();
    $this->db->or_group_start();
        $this->db->where("col1 >",$cin);
        $this->db->where("col1 <",$cout);
    $this->db->group_end();
    $this->db->or_group_start();
        $this->db->where("col1",$cin);
        $this->db->or_where("col2",$cout);
        $this->db->or_where("col1",$cout);
        $this->db->or_where("col2",$cin);
    $this->db->group_end();
    $this->db->or_group_start();
        $this->db->where("col2 >",$cin);
        $this->db->where("col2 <",$cout);
    $this->db->group_end();
$this->db->group_end();
$this->db->where_in("col3",$subquery);
$sbquery = $this->db->get_compiled_select();

    $this->db->from('table1');
    $this->db->where("tid",$cid);
    $this->db->where_not_in("cid",$sbquery);
    $result=$this->db->get_compiled_select();
    var_dump($result);
    exit;

Этот код показывает следующий запрос (как результат var_dump):

SELECT * FROM `table1` WHERE `tid` = '6' AND `cid` NOT IN('SELECT `pid`\nFROM `table2`\nWHERE (\n (\n`col1` < \'2018-12-10\'\nAND `col2` > \'2018-12-10\'\n )\nOR (\n`col1` < \'2018-12-16\'\nAND `col2` > \'2018-12-16\'\n )\nOR (\n`col1` > \'2018-12-10\'\nAND `col1` < \'2018-12-16\'\n )\nOR (\n`col1` = \'2018-12-10\'\nOR `col2` = \'2018-12-16\'\nOR `col1` = \'2018-12-16\'\nOR `col2` = \'2018-12-10\'\n )\nOR (\n`col2` > \'2018-12-10\'\nAND `col2` < \'2018-12-16\'\n )\n )\nAND `col3` IN(\'SELECT `sno`\\nFROM `table1`\\nWHERE `cid` = \\\'6\\\'\')')

Это дает неверные результаты, когда я использую следующий код (последние 3 строки кода):

$result=$this->db->get()->result();
var_dump($result);
exit;

Если я выполняю тот же запрос непосредственно в SQL, я получаю те же неверные результаты.

Но, если я удаляю косые черты, одинарные кавычки, новую строку и другие специальные символы, чтобы попасть в переписанный запрос непосредственно в sql, я получаю совершенно точные результаты.

SELECT * FROM `table1` WHERE `tid` = '6' AND `cid` NOT IN(SELECT `pid` FROM `table2` WHERE ((`col1` < '2018-12-10' AND `col2` > '2018-12-10') OR (`col1` < '2018-12-16' AND `col2` > '2018-12-16') OR (`col1` > '2018-12-10' AND `col1` < '2018-12-16') OR (`col1` = '2018-12-10' OR `col2` = '2018-12-16' OR `col1` = '2018-12-16' OR `col2` = '2018-12-10') OR (`col2` > '2018-12-10' AND `col2` < '2018-12-16')) AND `col3` IN(SELECT `sno` FROM `table1` WHERE `cid` = '6'))

Пожалуйста, предложитерешение.

1 Ответ

0 голосов
/ 08 декабря 2018

Добавьте FALSE в качестве третьего параметра в вашем подзапросе активных записей, чтобы операторы не экранировались.
Измените:

$this->db->where_in("col3",$subquery);
...
$this->db->where_not_in("cid",$sbquery);

на:

$this->db->where_in("col3",$subquery,FALSE);
...
$this->db->where_not_in("cid",$sbquery,FALSE);
...