リストから絞り込んで取得すると共にトータル件数を取得

例えば

table
+--------------+
|  id |  name  |
+-----+--------+   
|   1 |  name1 |
+-----+--------+
|   2 |  name2 |
+--------------+

こんなテーブルがあったとして、普通なら
1. リストを取得

SELECT id, name
FROM table
/* Oracle */ WHELE ROWNUM BETWEEN :START AND :END
/* MySql */ LIMIT :COUNT OFFSET :OFFSET

2. トータル件数取得

SELECT COUNT(id) AS total
FROM table

なんて感じですごく効率の悪いことをしていた。
けど、ちょっと調べてみたらもっと便利にリストとトータル件数を取得できるらしい。

Oracle の場合

OVER() を使う

SELECT id, name, COUNT(id) OVER() AS total
FROM table
WHERE ROWNUM BETWEEN :START AND :END

mysql の場合

リスト取得SQLの最初に SQL_CALC_FOUND_ROWS をいれる

SELECT SQL_CALC_FOUND_ROWS id, name
FROM table
LIMIT :COUNT OFFSET :OFFSET

その後すぐに FOUND_ROWS() を使って取得する

SELECT FOUND_ROWS() AS total

結論

mysql の場合、2回SQLを発行しないといけないのには変わりないけど、
それでも最初のよりは全然早いし楽ですね。