SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace);
Comment écrire la déclaration de sélection ci-dessus dans le code actif de CodeIgniter?
SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace);
Comment écrire la déclaration de sélection ci-dessus dans le code actif de CodeIgniter?
->where()
prend en charge le passage de n'importe quelle chaîne 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 le where()
indique à CodeIgniter de ne pas échapper la requête, ce qui pourrait la compliquer.
MISE À JOUR : Vous pouvez également consulter la bibliothèque de sous-requêtes que j'ai écrite.
$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.
Au lieu de cela, utilisez get_compiled_select()
:
#Créer la clause WHERE
$this->db->select('id_cer');
$this->db->from('revokace');
$where_clause = $this->db->get_compiled_select();
#Créer la requête principale
$this->db->select('*');
$this->db->from('certs');
$this->db->where("`id` NOT IN ($where_clause)", NULL, FALSE);
Je préfère presque personnellement cela car je suis capable de segmenter chaque sous-requête et de les garder en toute sécurité échappées et préparées une fois compilées.
Les enregistrements actifs de CodeIgniter ne prennent actuellement pas en charge les sous-requêtes, cependant j'utilise l'approche suivante :
# Créer la clause where
$this->db->select('id_cer');
$this->db->from('revokace');
$where_clause = $this->db->_compile_select();
$this->db->_reset_select();
# Créer la requête principale
$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 (à ma connaissance) qui compilent la requête et renvoient le SQL (sans l'exécuter) et réinitialisent la requête.
Dans la requête principale, le FALSE dans la clause WHERE indique à CodeIgniter de ne pas échapper à la requête (ou d'ajouter des backticks, etc.), ce qui pourrait perturber la requête. (Le NULL est simplement parce que la clause WHERE a un deuxième paramètre optionnel que nous n'utilisons pas)
Cependant, vous devez savoir que étant donné que _compile_select() et _reset_select() ne sont pas des méthodes documentées, il est possible que leur fonctionnalité (ou leur existence) puisse changer dans les prochaines versions.
$this->db->_compile_select(); est obsolète et je crois que _reset_select() l'est aussi. Cette réponse est absolue.
_compile_select()
n'est pas obsolète. Pour des raisons inconnues, à partir de CI 2.1.0, c'est une fonction protégée (dans system/database/DB_active_rec.php), ce qui signifie que vous ne pouvez pas l'utiliser à moins de supprimer la clause "protected" de la déclaration de la fonction (mais soyez toujours prudent lorsque vous modifiez le cœur).
Il est peut-être un peu tard pour la question initiale mais pour les futures requêtes, cela pourrait aider. La meilleure façon d'accomplir cela est d'obtenir le résultat de la requête interne dans un tableau comme ceci
$this->db->select('id');
$result = $this->db->get('votre_table');
return $result->result_array();
Ensuite, utilisez ce tableau dans la clause record active suivante
$this->db->where_not_in('id_de_une_autre_table', 'tableau_retourné_précédemment');
J'espère que cela aidera
Je pense que le problème avec cette solution est qu'elle nécessite deux appels à la base de données, alors qu'une sous-requête n'en nécessite qu'un seul.
Je suis d'accord. Mais je trouve cela beaucoup plus lisible. S'il n'y a pas de répercussions significatives sur les performances en raison de la requête supplémentaire lancée, je préférerais cette approche plutôt que d'écrire une sous-requête qui pourrait comporter ses propres pièges
Cette réponse n'implémente pas entièrement les méthodes disponibles de CI pour construire une requête. Les réponses précédemment publiées donnent de meilleurs conseils que ce post. Aucune nouvelle valeur pour cette page. De plus, le lien hypertexte n'a pas chargé correctement, il s'agit donc d'une réponse uniquement basée sur le code. Aucune valeur pour cette page ou les chercheurs.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.