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

Подзапрос в активной записи codeigniter

SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace);

Как написать вышеуказанный оператор select в активной записи CodeIgniter?

4b9b3361

Ответ 1

->where() поддерживает передачу любой строки в нее и будет использовать ее в запросе.

Вы можете попробовать:

$this->db->select('*')->from('certs');
$this->db->where('`id` NOT IN (SELECT `id_cer` FROM `revokace`)', NULL, FALSE);

,NULL,FALSE в where() указывает CodeIgniter не избегать запроса, что может испортить его.

UPDATE. Вы также можете проверить библиотеку подзапросов, которую я написал.

$this->db->select('*')->from('certs');
$sub = $this->subquery->start_subquery('where_in');
$sub->select('id_cer')->from('revokace');
$this->subquery->end_subquery('id', FALSE);

Ответ 2

Функции _compile_select() и _reset_select() устарели.
Вместо этого используйте get_compiled_select():

#Create where clause
$this->db->select('id_cer');
$this->db->from('revokace');
$where_clause = $this->db->get_compiled_select();

#Create main query
$this->db->select('*');
$this->db->from('certs');
$this->db->where("`id` NOT IN ($where_clause)", NULL, FALSE);

Ответ 3

CodeIgniter Active Records в настоящее время не поддерживают подзапросы. Однако я использую следующий подход:

#Create where clause
$this->db->select('id_cer');
$this->db->from('revokace');
$where_clause = $this->db->_compile_select();
$this->db->_reset_select();

#Create main query
$this->db->select('*');
$this->db->from('certs');
$this->db->where("`id` NOT IN ($where_clause)", NULL, FALSE);

_compile_select() и _reset_select() - это два недокументированных метода (AFAIK), которые компилируют запрос и возвращают sql (без его запуска) и reset запрос.

В основном запросе FALSE в предложении where сообщает codeigniter не избегать запроса (или добавить backticks и т.д.), что испортило бы запрос. (NULL просто потому, что предложение where имеет необязательный второй параметр, который мы не используем)

Однако вы должны знать, что _compile_select() и _reset_select() не являются документально подтвержденными методами, возможно, что функциональные возможности (или существование) могут измениться в будущих выпусках.

Ответ 4

Для запроса: SELECT * FROM (SELECT id, product FROM product) as product вы можете использовать:

$sub_query_from = '(SELECT id, product FROM product ) as product';
$this->db->select();
$this->db->from($sub_query_from);
$query = $this->db->get()

Обратите внимание, что в строке sub_query_from вы должны использовать пробелы между ... product ) as...

Ответ 5

Может быть немного поздно для исходного вопроса, но для будущих запросов это может помочь. Лучший способ добиться этого - Получите результат внутреннего запроса в массив, подобный этому

$this->db->select('id');
$result = $this->db->get('your_table');
return  $result->result_array();

И затем используйте, чем массив, в следующем объявлении активной записи

$this->db->where_not_in('id_of_another_table', 'previously_returned_array');

Надеюсь, что это поможет

Ответ 7

Я думаю, что этот код будет работать. Я не знаю, является ли это приемлемым типом запросов в CI, но он отлично работает в моей предыдущей проблеме.:)

$subquery = 'SELECT id_cer FROM revokace';

$this->db->select('*');
$this->db->where_not_in(id, $subquery);
$this->db->from('certs');
$query = $this->db->get();

Ответ 8

    $where.= '(';
    $where.= 'admin_trek.trek='."%$search%".'  AND ';
    $where.= 'admin_trek.state_id='."$search".'  OR ';
    $where.= 'admin_trek.difficulty='."$search".' OR ';
    $where.= 'admin_trek.month='."$search".'  AND ';
    $where.= 'admin_trek.status = 1)';

    $this->db->select('*');
    $this->db->from('admin_trek');
    $this->db->join('admin_difficulty',admin_difficulty.difficulty_id = admin_trek.difficulty');
    $this->db->where($where); 
    $query = $this->db->get();