6

SELECT FOUND_ROWS()が機能しないか、1を返すどこを間違えたのかわからない

$qry ="SELECT SQL_CALC_FOUND_ROWS DISTINCT user_id, login_date
FROM login_members
WHERE (login_date BETWEEN '2012-02-13 00:00:00' AND '2013-02-13 23:59:59') 
LIMIT 0, 10";

$rs = mysql_query($qry);

$total_records = mysql_result(mysql_query("SELECT FOUND_ROWS()"),0,0);
4

7 に答える 7

11

受け入れられた答えは間違っているようです。LIMIT を含むクエリの後に found_rows() を使用することをお勧めします。

ANSWER : 問題は RETURN 1 と、場合によっては found_rows(); の結果としての 0 についてです。

最初の選択ステートメントの後に他のクエリが実行されたときに発生します。特に IDE や一部のクライアントを使用してクエリを実行している場合は、クエリの前後に追加の「準備」クエリが実行されます。

また、found_rows() は、サーバーで実行された最後のクエリによって返された結果の数を返します。この場合、これは私たちが期待するものではありません。

したがって、RETURN 1 または 0 エラーです。

検証: サーバーで一般的なログ記録を有効にし、クエリを実行することで、これを検証できます。「最初のクエリと見つかった行のクエリ」の間に実行される追加のクエリがいくつか表示されます。

FIX ストアド プロシージャ、または古い COUNT(*)。

パフォーマンスに関しては、ほとんど違いはありません。

追加

オブジェクトが返された行の総数を見つけることである場合は、問題ありません。SQL_CALC_FOUND_ROWS の使用は重要ではなくなります。

これが一般的なルールです。見つかった行や SQL_CALC_FOUND_ROWS には LIMIT は必要ありません。しかし、それらのうちの 3 つを一緒に使用して、非常に有用な結果を得ることができます。

つまり、次のようなものを実行しています。

SELECT  SQL_CALC_FOUND_ROWS * from some_table_name LIMIT 0,10; 
SELECT FOUND_ROWS();

SELECT * from sometable_name; を実行した場合にクエリによって返される行数を取得します。すなわち: LIMIT なし。

そうは言っても、

SELECT * from some_table_name LIMIT 0, 10; 
SELECT FOUND_ROWS(); 

制限のcosが<= 10になる結果の総数が得られます。実用的な目的はありませんが、エラーではありません。

于 2013-09-19T07:35:51.997 に答える
8

SELECTステートメントにはLIMIT、サーバーがクライアントに返す行数を制限する句を含めることができます。場合によっては、LIMIT を指定せずにステートメントを再度実行しなくても、ステートメントが返す行数を知ることが望ましい場合があります。この行数を取得するSQL_CALC_FOUND_ROWSには、ステートメントにオプションを含め、後でSELECT呼び出します。FOUND_ROWS()

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;

mysql> SELECT FOUND_ROWS();

2 番目は、句なしで記述されていた場合に最初の行が返されたであろうSELECT行数を示す数値を返します。SELECTLIMIT

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

于 2013-02-13T06:16:06.907 に答える
5

このクエリを使用します

$qry ="SELECT DISTINCT user_id, login_date
FROM login_members
WHERE (login_date BETWEEN '2012-02-13 00:00:00' AND '2013-02-13 23:59:59') 
LIMIT 0, 10";

前の SELECT に SQL_CALC_FOUND_ROWS が含まれているが、前の SELECT に SQL_CALC_FOUND_ROWS が含まれていない場合、FOUND_ROWS() は、この前の SELECT によって返された行数を返します。

于 2013-02-13T06:13:09.657 に答える
0

SQL_CALC_FOUND_ROWSこれは、クエリが返す行数を制限したいが、クエリを再度実行せずに完全な結果セットの行数を決定したい場合にFOUND_ROWS()役立ちます。例として、検索結果の他のセクションを表示するページへのリンクを含むページ表示を提示する Web スクリプトがあります。を使用FOUND_ROWS()すると、残りの結果に必要なページ数を決定できます。

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

2 番目は、句 なしで記述されていた場合に最初の行が返されたであろうSELECT行数を示す数値を返します。 成功した最新のステートメントにオプションが ない場合、そのステートメントによって返された結果セットの行数を返します。ステートメントに句が含まれている場合は 、制限までの行数を返します。たとえば、ステートメントにまたはが含まれている場合、 はそれぞれ 10 または 60 を返します。SELECTLIMITSQL_CALC_FOUND_ROWSSELECTFOUND_ROWS()LIMITFOUND_ROWS()FOUND_ROWS()LIMIT 10LIMIT 50, 10

$qry ="SELECT SQL_CAL_FOUND_ROWS  *  
       FROM login_members
       WHERE (login_date BETWEEN '2012-02-13 00:00:00' AND '2013-02-13 23: 
59:59') 
       LIMIT 0, 10";

$rs = mysql_query($qry);

$total_records = mysql_query("SELECT FOUND_ROWS() as `found_rows`;");

echo $total_records // display total record count
于 2013-02-13T07:44:49.567 に答える
0

する必要があります:

$qry ="SELECT DISTINCT user_id, login_date FROM login_members
WHERE (login_date BETWEEN '2012-02-13 00:00:00' AND '2013-02-13 23:59:59') 
LIMIT 0, 10";

$rs = mysql_query($qry);

$total_records = mysql_result(mysql_query("SELECT FOUND_ROWS()"),0,0);

echo $total_records // display total record count

使用する必要はありませんSQL_CALC_FOUND_ROWS

于 2013-02-13T06:29:28.923 に答える