FOUND_ROWS()

FOUND_ROWS()

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() の値は近似のみになる。

  • UNIONLIMIT が提示されない場合、SQL_CALC_FOUND_ROWS は無視され、UNION を処理するために作成された一時テーブルの行の数を戻す。