目次
環境
Codeigniter : 3.1.7
はじめに
前回、私がCodeingterでサブクエリを書くやり方を書きました。
今回は、CodeigniterでUnionを書くやり方を書きます。
CodeigniterにはUnionのQuery Builderが存在しない
CodeigniterにはDBを操作する為のライブラリが用意されています。
大概の事ならこのライブラリを使えば解決します。
しかしCodeigniterにはUnionをする為のライブラリが存在しません。
query()使えば良くね?
まあ、そうなんですけどね。
query()使って、泥臭くSQLを記載すれば書けるは書けます。
でも、エスケープはどうするの?
escape()使って記載します?
でも、それソースコード見づらくないですか?(好みの問題
サブクエリ使おうよ!
ここで前回書いた記事が生きてきます。
例えばこう↓
// 読み込み
$subquery_init = $this->load->database('',TRUE);
//クエリA
$subQuery[] = $subquery_init->select('no', FALSE)->from('tableA')->get_compiled_select();
// 初期化
$subquery_init->reset_query();
//クエリB
$subQuery[] = $subquery_init->select('no', FALSE)->from('tableB')->get_compiled_select();
// 初期化
$subquery_init->reset_query();
//クエリC
$subQuery[] = $subquery_init->select('no', FALSE)->from('tableC')->get_compiled_select();
// 初期化
$subquery_init->reset_query();
// 配列を「) UNION (」で文字列結合
$unionQuery = join(') UNION (', $subQuery);
$this->db->query("({$unionQuery}) ORDER BY no");
これでSQLは↓になる
(SELECT no FROM tableA) UNION (SELECT no FROM tableB) UNION (SELECT no FROM tableC) ORDER BY no
うん、とってもグットな気がします。(好みの問題
この時に注意しなければいけないのは、サブクエリを()で包むことです。
そうしないと、ORDER BYやLIMITなどが上手く動きません。
今日はこの辺でー