宣言
FOUND_ROWS()
説明
SELECT ステートメントには、データベースサーバーがクライアントに返す行数を制限するための LIMIT 句を含めることができます。場合によっては、LIMIT を指定しない場合にそのステートメントが実際に返す行数を知るために、ステートメントを再度実行する必要があります。SELECT ステートメントで SQL_CALC_FOUND_ROWS を選択し、FOUND_ROWS() 関数を呼び出すことで、LIMIT を指定しない場合にそのステートメントが返す行数を取得できます。
以下の例を参照してください:
obclient> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
WHERE id > 100 LIMIT 10;
obclient> SELECT FOUND_ROWS();
2番目の SELECT ステートメントは、LIMIT 句がない場合に最初の SELECT ステートメントが返す行数を示す数値を返します。上記の SELECT ステートメントで SQL_CALC_FOUND_ROWS オプションを使用しない場合、LIMIT を使用する場合と使用しない場合で、FOUND_ROWS() が返す結果が異なる可能性があります。
FOUND_ROWS() 関数が返す有効な行数は瞬時のものであり、SELECT SQL_CALC_FOUND_ROWS ステートメントの後に続くステートメントを越えることはできません。後でこの値が必要になる場合は、保存しておく必要があります。
以下の例を参照してください:
obclient> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
obclient> SET @rows = FOUND_ROWS();
SQL_CALC_FOUND_ROWS を使用している場合、システムは全結果セットに何行あるかを計算する必要があります。それでも、結果セットをクライアントに送信する必要がないため、LIMIT を使用せずにクエリを再度実行するよりも高速です。
SQL_CALC_FOUND_ROWS と FOUND_ROWS() は、クエリが返す行数を制限したい場合に非常に便利であり、クエリを再度実行することなく結果セット全体の行数を確認できます。例えば、検索結果の他の部分に移動するためのページへのリンクを含むページ表示のWebスクリプトを提供する場合、FOUND_ROWS() を使用することで、残りの結果に必要なページ数を特定できます。
SQL_CALC_FOUND_ROWS と FOUND_ROWS() の適用は、単純な SELECT ステートメントよりも UNION クエリの方が複雑です。これは、UNION では LIMIT が複数の場所に現れる可能性があるためです。UNION 内の個々の SELECT ステートメント、または UNION の結果全体に適用される可能性があります。
SQL_CALC_FOUND_ROWS による UNION の期待される結果は、グローバルな LIMIT 条件がない場合に、適切な行数を返すことです。SQL_CALC_FOUND_ROWS と UNION を併用する条件は以下の通りです:
SQL_CALC_FOUND_ROWSキーワードはUNIONの最初のSELECT文に含まれている必要があります。FOUND_ROWS()の値はUNION ALLを使用した場合にのみ正確です。ALLを伴わないUNIONを使用する場合、2回の削除が発生し、FOUND_ROWS()の値は近似値になります。UNION内にLIMIT句が存在しない場合、SQL_CALC_FOUND_ROWSは無視され、一時テーブルに作成されたUNIONを処理するための行数が返されます。
例
obclient> SELECT SQL_CALC_FOUND_ROWS * FROM t2;
obclient> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
| 3 |
+--------------+
1 row in set