0

PHP と MySQL のデータベースからレコードを取得し、jqgrid に表示しています。

今、最初のリクエストで10行のデータを含む1ページをリクエストします。

それを達成するために、oneクエリを起動して取得し、すべての合計レコードを含むものtotal number of recordsを計算 します。totalpages

限られsecondたレコード、つまり1 to 10次回11 to 20などを起動するクエリ。

したがって、問題は、レコードの総数を取得するために1つと、グリッドの限られた行を取得するために2つのクエリを実行する必要があるたびに発生することです。

上記のことを達成するためにクエリを1つだけ起動することは可能ですか?

通常の方法でレコードをフェッチするには、上記のシナリオは問題ありませんが、検索を実行する場合、基準に一致する行の総数をフェッチするためと、基準を満たす限られた行のみをフェッチするために、2 つのクエリを起動する必要があります。

アップデート

行にアクセスするための私の制限は、レコードの総数に依存するため、1 つのクエリのみを起動するオプションはありません。私のPHPコードがどのように制限を数えているか見てください

1) クエリを実行して合計レコードにアクセスする

$selectMemberData = "SELECT * FROM tbl_member";
    //some db code  ... 
    // store the total records value
    $count = $dbMemberData->numRows; 



if( $count >0 ) {
    $total_pages = ceil($count/$limit);
} else {
    $total_pages = 0;
}

if ($page > $total_pages) $page=$total_pages;


$start = ( $limit * $page ) - $limit; // do not put $limit*($page - 1)

   //Fire another query to fetch limited records 

    $selectMember = "SELECT * FROM tbl_member   LIMIT "  .$start.", ". $limit;

私の懸念は、その時点でオートコンプリート検索を使用すると、2 つのクエリを起動するのにかなりの費用がかかることです。start問題は、取得およびend制限する合計レコードに依存していることです

4

3 に答える 3

1
select * 
from yourtable 
inner join 
(
select count(*) as count 
from yourtable
) as t2
limit 0,10

これにより、1つのクエリで、テーブル全体の行の合計数となる各行にカウントの列が追加されます。

例についてはsqlfiddle

結合を使用したくない場合は、ユニオンを使用できます。

select id,count(*) as data 
from yourtable
union all
select * 
from yourtable
limit 0, 10

ただし、最初の選択ですべての列を宣言する必要があります。null as column_namenullにしたい場合はカウントを保持したい列を除いて、それぞれのように書くことができます。そうでない場合は、ランダムデータを保持するだけです。

sqlfiddle

データにループを使用していると仮定しているwhileので、次を使用できます。

mysql_fetch_assoc($row);
$all_records_count = $row['data'];
while(mysql_fetch_assoc($row)){
...do something with results...}

カウントを保持する最初の行を取得し、その後、結果のループを開始します。

于 2012-09-20T19:35:54.200 に答える
0

必ずしも 2 つのクエリを起動する必要はありません。単一のストアド プロシージャを起動して、そこから 2 つの結果セットを取得できます。最初の 1 つは限られたレコードを含み、もう 1 つは総レコードを含みます。

このために、MySql のfound_rows()関数を使用して、LIMIT 句を使用して限られた結果を返すクエリ内の実際のレコード数を調べることができます。詳細については、http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows を参照してください

例えば

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

次に、これを発射します

SELECT found_rows();
于 2012-09-20T19:30:23.213 に答える
0

SQL_CALC_FOUND_ROWSを確認してください。

于 2012-09-20T19:30:02.193 に答える