SELECT
文は、サーバがクライアントに戻す行の数を制限するために、LIMIT
句を含んでいる場合があります。場合によっては、LIMIT
なしでステートメントが返す行の数を知ることが望ましいですが、ステートメントを再度実行しないでください。この行のカウントを得るには、SELECT
文に SQL_CALC_FOUND_ROWS
オプションを含み、その後に FOUND_ROWS()
を実行します :
mysql>SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
->WHERE id > 100 LIMIT 10;
mysql>SELECT FOUND_ROWS();
2 番目の SELECT
は、最初の SELECT
が返した、LIMIT
句なしで書かれた行数を示す数字を戻します。
最も最近の SELECT
文に SQL_CALC_FOUND_ROWS
オプションがない場合、FOUND_ROWS()
はその文によって戻された結果セットの行の数を戻します。
FOUND_ROWS()
によって得られる行数は一過性のもので、SELECT SQL_CALC_FOUND_ROWS
文に続くステートメントを過ぎると取得できなくなるようになっています。この値を後で参照する必要がある場合は保存してください :
mysql>SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
mysql>SET @rows = FOUND_ROWS();
SELECT SQL_CALC_FOUND_ROWS
を使用している場合、MySQL は完全な結果セットにいくつ行があるか計算する必要があります。しかし、結果セットをクライアントに送る必要がないため、LIMIT
なしでクエリを再度実行するより速く行えます。
SQL_CALC_FOUND_ROWS
および FOUND_ROWS()
は、クエリが戻す行の数を制限する際に便利ですが、クエリを再度実行することなく完全な結果セットの行の数を決定するためにも利用できます。検索結果の他のセクションを表示するページへのリンクを含む、ページ表示を提示するウェブ
スクリプトが例に挙げられます。FOUND_ROWS()
を使用することで、残りの結果がさらに何ページを必要とするかを決定することができます。
SQL_CALC_FOUND_ROWS
および FOUND_ROWS()
の使用は、UNION
の複数箇所で LIMIT
が起こる場合があるため、簡単な SELECT
文よりも、UNION
文に対してのほうがより複雑になります。これは、UNION
の個々の SELECT
文に用いられるか、または UNION
結果全体にグローバルに適用されます。
UNION
に対する SQL_CALC_FOUND_ROWS
の目的は、グローバルな LIMIT
なしで返される行数を戻すことです。UNION
との SQL_CALC_FOUND_ROWS
の使用の条件は以下 :
SQL_CALC_FOUND_ROWS
キーワードが、UNION
の最初の SELECT
に表示されている。
UNION ALL
が使用されている場合のみ、FOUND_ROWS()
の値は正確。ALL
なしで UNION
が使用される場合は、複製が除去され、FOUND_ROWS()
の値は近似のみになる。
UNION
で LIMIT
が提示されない場合、SQL_CALC_FOUND_ROWS
は無視され、UNION
を処理するために作成された一時テーブルの行の数を戻す。