めも。
たとえば特定のカラムの値が10~20のものを取得したいといった場合に便利。
WHERE col_name BETWEEN 10 AND 20
上記のSQLは「以上」、「以下」を指定するための演算子なので10と20は含まれることに注意。
またNOTを付加することで否定の条件も指定可能
WHERE col_name NOT BETWEEN 10 AND 20
めも。
たとえば特定のカラムの値が10~20のものを取得したいといった場合に便利。
WHERE col_name BETWEEN 10 AND 20
上記のSQLは「以上」、「以下」を指定するための演算子なので10と20は含まれることに注意。
またNOTを付加することで否定の条件も指定可能
WHERE col_name NOT BETWEEN 10 AND 20
調べてみたら普通にオプションで渡すだけだった。
$options = array( 'group' => 'col_name' ); $this->Model->find('all', $options);
意外と今まで知らなかったので戒めも。
GROUP BY句を複数指定する場合は、下記の通りカンマ区切りでカラム名を指定する。
SELECT * FROM table_name GROUP BY col_1, col_2, col3
また下記のようにソート順をそれぞれで指定することも可能。
SELECT * FROM table_name GROUP BY col_1 DESC, col_2 ASC
めも。
SQLを発行する再、文の一番先頭に「EXPLAIN」とつけると、オプティマイザのデバッグ情報を取得することが出来る。
下記例。
EXPLAIN SELECT * FROM table_name WHERE id = 1
上記SQLによって取得出来る情報の「type」の欄が重要。
「type」には下記表のものが多く見られる。
system | テーブルに1レコードしかない状態 |
const | マッチするレコードが1件しかない状態。PRIMARY KEYまたはUNIQUEインデックスを利用して検索される |
eq_ref | JOINにおいてPRIMARY KEYまたはUNIQUEインデックスを利用して1つのレコードを検索している状態。理想的なJOINの形式 |
range | インデックスを用いた範囲検索 |
index | すべてのレコードのインデックスをスキャンする必要がある状態(フルインデックススキャン) |
ALL | すべてのレコードを走査する必要がある状態(フルテーブルスキャン) |
上から順に高速なので、なるべく上に近づくようなSQLを発行してやれば結果的にパフォーマンスは上昇する。
メモ。
■最終行に移動する
Shift + g
■先頭行に移動する
gg [g2回]
■指定した行に移動する
:[行数] → Enter
CakePHPにてSQLを確認する方法は、ブラウザ上からデバッグキットを用いるか、sql_dumpの欄を見る方法がある。
ではコンソールから見たい場合はどのように取得すればいいのか?
ということで調べてみた。
■モデルから
$log = $this->getDataSource()->getLog(); var_dump($log);
■コントローラーから
$log = $this->Model->getDataSource()->getLog(); var_dump($log);
というように、getDataSouce()メソッドを用いることでSQLを取得することが出来た。