web-dev-qa-db-fra.com

sous-requête dans l'enregistrement actif codeigniter

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

Comment écrire l'instruction select ci-dessus dans l'enregistrement actif CodeIgniter?

59
mardon

->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);
77
Rocket Hazmat

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);
37
user2336400

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.

14
mattumotu

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

2
Abhijit Mazumder

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...

1
user3644751

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();
0
x3mCharles
$this->db->where('`id` IN (SELECT `someId` FROM `anotherTable` WHERE `someCondition`='condition')', NULL, FALSE);

Source: http://www.247techblog.com/use-write-sub-queries-codeigniter-active-records-condition-full-explaination/

0
Mohit Bumb
    $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
Shashank Saxena