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



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


Как я могу написать выше select оператор в CodeIgniter active record?

567   8  

8 ответов:

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

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

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

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

обновление: вы также можете проверить библиотека подзапрос я писал.

$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 в настоящее время не поддерживают подзапросы, однако я использую следующий подход:

#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 (без его запуска) и сбрасывают запрос.

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

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

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

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

а затем использовать than array в следующем предложении active record

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

надеюсь, что это помогает

запрос: 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->where('`id` IN (SELECT `someId` FROM `anotherTable` WHERE `someCondition`='condition')', NULL, FALSE);

источник: http://www.247techblog.com/use-write-sub-queries-codeigniter-active-records-condition-full-explaination/

Я думаю, что этот код будет работать. Я не знаю, является ли это приемлемым стилем запроса в 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();

Comments

    Ничего не найдено.