kunitsuji
tsuji****@m-s*****
2008年 6月 19日 (木) 17:38:55 JST
kunitsujiです。 櫻井さん。 >> よくあるのが、LIMITをつけて取得件数を分けてページネーションするのですが、 >> そのときに全体の件数をとる特にCOUNTを使いますが(MyISAMとか) >> >> num_rowの場合はSQLに対しての件数ですから、LIMITで20件だと20ですね。 > >今回、まさにこの状況でした。 >ページネーションでは全体の件数がいくつか指定する必要があるので、モデルク >ラスに > ・表示させたいデータをLIMIT, OFFSET付きで取ってくる関数 > ・それとは別に、表示させたいデータの全ての「件数のみ」を取得する関数 >を書いて、コントロールクラスから呼び出すようにしました。 この部分ですが、上記だと2回SQLが動くことになりますよね。 次のようにされてみてはどうでしょう? MySQLということで。 $sql = "SELECT SQL_CALC_FOUND_ROWS " . "* " . "FROM " . "TABLE_NAME " . "WHERE " . "A = B " . "LIMIT 0, 20 " $result = $this->db->query($sql); $count = $this->db->query("SELECT FOUND_ROWS() as count"); として、 $count = $total->row(); var_dump($count->count); とすればトータル件数が取り出せますね。 3000件程度でベンチとりました。 こちらのほうが、0.0001〜0.0003早いようです(笑) 件数が多くなればこちらのほうがいいのでしょうかね。 少なくともMyISAMならcount(*)は特殊な取り出ししますが、InnoDBなどの場合は たぶんもっと差が出るのではないでしょうか?