忘れないように記録しとこ

カバの樹

CodeigniterだってUnionを使ったSQLが書けちまうんだっ

2018年3月27日

環境

Codeigniter : 3.1.7

 

はじめに

前回、私がCodeingterでサブクエリを書くやり方を書きました。

https://www.kabanoki.net/1932

 

今回は、CodeigniterでUnionを書くやり方を書きます。

 

CodeigniterにはUnionのQuery Builderが存在しない

CodeigniterにはDBを操作する為のライブラリが用意されています。

大概の事ならこのライブラリを使えば解決します。

しかしCodeigniterにはUnionをする為のライブラリが存在しません。

 

query()使えば良くね?

まあ、そうなんですけどね。

query()使って、泥臭くSQLを記載すれば書けるは書けます。

でも、エスケープはどうするの?
escape()使って記載します?
でも、それソースコード見づらくないですか?好みの問題

 

サブクエリ使おうよ!

ここで前回書いた記事が生きてきます。

https://www.kabanoki.net/1932

 

例えばこう↓


// 読み込み
$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 BYLIMITなどが上手く動きません。

 

今日はこの辺でー

 

  • B!