SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace);
Как написать вышеуказанный оператор select в активной записи CodeIgniter?
SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace);
Как написать вышеуказанный оператор select в активной записи CodeIgniter?
->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);
Функции _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);
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() не являются документально подтвержденными методами, возможно, что функциональные возможности (или существование) могут измениться в будущих выпусках.
Для запроса: 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...
Может быть немного поздно для исходного вопроса, но для будущих запросов это может помочь. Лучший способ добиться этого - Получите результат внутреннего запроса в массив, подобный этому
$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');
Надеюсь, что это поможет
$this->db->where('`id` IN (SELECT `someId` FROM `anotherTable` WHERE `someCondition`='condition')', NULL, FALSE);
Я думаю, что этот код будет работать. Я не знаю, является ли это приемлемым типом запросов в 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();
$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();