подзапрос в активной записи codeigniter - PullRequest
62 голосов
/ 18 мая 2011
SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace);

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

Ответы [ 8 ]

81 голосов
/ 18 мая 2011

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

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

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

,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);
37 голосов
/ 30 апреля 2013

Функции _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);
15 голосов
/ 03 июня 2011

Активные записи 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 () не являются документированными методами, возможно, что есть функциональность (илисуществование) может измениться в будущих выпусках.

2 голосов
/ 19 ноября 2012

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

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

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

1 голос
/ 03 марта 2015

Для запроса: 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...

0 голосов
/ 05 октября 2016
    $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();
0 голосов
/ 06 апреля 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...