SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace);
Comment écrire l'instruction select ci-dessus dans l'enregistrement actif CodeIgniter?
->where()
prend en charge le passage de toutes les chaînes et l’utilisera dans la requête.
Vous pouvez essayer d'utiliser ceci:
$this->db->select('*')->from('certs');
$this->db->where('`id` NOT IN (SELECT `id_cer` FROM `revokace`)', NULL, FALSE);
Le ,NULL,FALSE
dans la where()
indique à CodeIgniter de ne pas échapper à la requête, ce qui pourrait la gâcher.
UPDATE: Vous pouvez également consulter la bibliothèque de sous-requêtes j'ai écrit.
$this->db->select('*')->from('certs');
$sub = $this->subquery->start_subquery('where_in');
$sub->select('id_cer')->from('revokace');
$this->subquery->end_subquery('id', FALSE);
Les fonctions _compile_select()
et _reset_select()
sont obsolètes.
Utilisez plutôt 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 ne prend actuellement pas en charge les sous-requêtes. Cependant, j'utilise l'approche suivante:
#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 () et _reset_select () sont deux méthodes non documentées (AFAIK) qui compilent la requête et renvoient le SQL (sans l'exécuter) et réinitialisent la requête.
Sur la requête principale, la clause FALSE dans la clause where indique à codeigniter de ne pas échapper à la requête (ni d'ajouter des backticks, etc.), ce qui gâcherait la requête. (NULL est simplement parce que la clause where a un second paramètre optionnel que nous n'utilisons pas)
Cependant, sachez que _compile_select () et _reset_select () ne sont pas des méthodes documentées, il est possible que leurs fonctionnalités (ou leur existence) soient modifiées dans les prochaines versions.
Il est peut-être un peu tard pour la question initiale, mais pour les futures requêtes, cela pourrait aider ... Le meilleur moyen d'y parvenir est.
$this->db->select('id');
$result = $this->db->get('your_table');
return $result->result_array();
Et puis utiliser que tableau dans la clause d'enregistrement actif suivant
$this->db->where_not_in('id_of_another_table', 'previously_returned_array');
J'espère que cela t'aides
Pour la requête: SELECT * FROM (SELECT id, product FROM product) as product
, vous pouvez utiliser:
$sub_query_from = '(SELECT id, product FROM product ) as product';
$this->db->select();
$this->db->from($sub_query_from);
$query = $this->db->get()
Veuillez noter que, dans la chaîne sub_query_from, vous devez utiliser des espaces entre ... product ) as...
Je pense que ce code fonctionnera. Je ne sais pas s'il s'agit d'un style de requête acceptable dans CI, mais cela fonctionne parfaitement dans mon problème précédent. :)
$subquery = 'SELECT id_cer FROM revokace';
$this->db->select('*');
$this->db->where_not_in(id, $subquery);
$this->db->from('certs');
$query = $this->db->get();
$this->db->where('`id` IN (SELECT `someId` FROM `anotherTable` WHERE `someCondition`='condition')', NULL, FALSE);
$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();