CodeIgniter3 の QueryBuilder でサブクエリを作る

databaseの接続設定は済んでいる前提

$subQuery = $this->db->select('count(*) as column_count, sample_id')->get_compiled_select('table_a');

$this->db->select('*')->join("({$subQuery}) AS table_a", 'table_a.sample_id = samples.id', 'left', false);
$query = $this->db->get('samples');
  • get() ではなく、get_compiled_select() を使用することでクエリを実行しない。
  • get_compiled_select() の第2引数がデフォルト true なので $this->db->reset_query() を実施してくれる。(正しくは _reset_select() )
  • $this->db->from('table') でやる場合はサブクエリの後に $this->db->reset_query()を呼んであげる必要がある。

個人的にはget_compiled_select()で済ませる方がシンプルなので好きです。


※   上記コードはサブクエリとの join() メソッドで第4引数のエスケープを false にしているので場合によってはSQLインジェクションが発生します。   サブクエリでjoinしてあげるクエリはあくまで CodeIgniter の QueryBuilder で組み立てた文字列を使用するようにしましょう!


参考記事

codeigniter.jp www.kabanoki.net


株式会社エイルシステムではWebエンジニア・モバイルアプリエンジニアを募集しています。
実務経験がなくてもOKです。ご興味のある方は弊社HPよりご連絡ください。