宣言
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 の結果全体に適用できます。
UNION に対する SQL_CALC_FOUND_ROWS の期待される結果は、グローバルな LIMIT 条件がない場合に、適切な行数を返すことです。SQL_CALC_FOUND_ROWS と UNION を一緒に使用する条件は次のとおりです:
SQL_CALC_FOUND_ROWSキーワードは、UNIONの最初のSELECTに含まれている必要があります。LIMITなしでUNION ALLを使用する場合にのみ、FOUND_ROWS()の値は正確です。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