とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

【SamuraiFw:MySql】SQL_CALC_FOUND_ROWS オプションと FOUND_ROWS()

今流したSQLのレコード数を取りたい時ってありますよね、
foreeachでまわして取ればソースが汚くなるし、
count(*)で取得すると今度はもう一回同じクエリを投げないといけなくなるので、
性能が落ちる。

こんな時はSQL_CALC_FOUND_ROWSを使えばcount(*)より、早いくて、foreachで回すよりきれいにレコード数が取得できるとのこと、

たとえばtestテーブルがあるとして、つかいた時はこんな感じ

mysql > SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
       WHERE id > 100 LIMIT 10;
       
mysql > SELECT FOUND_ROWS();

まぁ結局2回投げるのは変わらないのだけど、それでもcount(*)よりはいい感じ。
しかもリミットつけても全体のレコードを取得してくれるのがいいですね。

SamuraiFwもこれに対応しています。
もしもConditionを使って取得している時は

$cond = $this->AG->getCondition();
$cond->where->id = $cond->isGreaterThan(1);
$hoge = $this->AG->getAllDitail($cond);
var_dump($hoge->getTotalRows());

これだけで取得できますが、べたにクエリを作成して、LIMIT句をつけた場合はこれに値がちゃんと入ってきません。
なので、こんな感じで取得します。

$sql = "SELECT * FROM test WHERE id >= :id LIMIT 0,5";
$param[':id'] = 1;
$hoge = $this->AG->findAllSql('test',$sql,$param,NULL,NULL,true);
var_dump($hoge->getTotalRows());

ちょっとSQLがかなり適当だけど、
findAllSqlメソッドの第6引数をtrueにすると取得できます。

これはfindAllSqlの第6引数がデフォルトfalseになっているから、
もしも毎回このメソッドを使う場合がデフォルトtrueにしてあげたほうがいいかもしれません。