環境

  • DBMS = MySQL 5ぐらい

FOUND_ROWS

  • 最後にSELECTした行数を取得するFOUND_ROWS()。
  • ページングする場合など、分母が欲しい場合があります。
  • たとえば100レコードあるけど、1ページに表示するデータは10レコードの場合。
  • 普通に考えたら、10レコード取得するSELECTと、同じ条件でCOUNT(*)するSELECTを発行すると思います。
  • MySQLにはこういう時のためと言える機能があります。

実行例

  • SELECTを2回発行することに違いはないですが、スマートですよね。

SQL_CALC_FOUND_ROWS指定なし

  • LIMIT 10しているので、FOUND_ROWS()も10を返却します。
mysql> SELECT * FROM tbl_name LIMIT 10;
-----------------------------
10 rows in set (0.00 sec)

mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
|           10 |
+--------------+
1 row in set (0.00 sec)

SQL_CALC_FOUND_ROWS指定あり

  • LIMIT 10していますが、SQL_CALC_FOUND_ROWS指定しているので、FOUND_ROWS()は全レコード数を返却します。
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name LIMIT 10;
-----------------------------
10 rows in set (0.00 sec)

mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
|           42 |
+--------------+
1 row in set (0.00 sec)

facebook slideshare rubygems github qiita