0

1mのレコードテーブルがあり、検索結果を10,000に制限し、それを超えないようにしたいとします。それで、私はそのために何を使用しますか?答えは、limit句を使用することです。

select recid from mytable order by recid asc limit 10000

これにより、このテーブルに入力された最後の10,000レコードが得られます。

これまでのところ、ページングは​​ありません。しかし、制限フレーズはすでに使用されています。

それは次のレベルに疑問を投げかけます。

このレコードの特定のレコードセットを一度に100レコードでページングしたい場合はどうすればよいですか?フレーズはすでに元のクエリの一部になっているので limit、今度はページングを処理するために、どのように再度使用しますか?

組織の場合。クエリには最初から制限句がありませんでした。ページングが進行する間、次のように調整してから、次のようlimit 0,100に調整します。しかし、現時点ではできません。limit 100,100limit 200,100

2つの制限フレーズを次々に使用したいと思うでしょう。これは機能しません。

limit 10000 limit 0,100確かにそれはエラーになるでしょう。

では、この特定の場合の解決策は何ですか?

[編集]

この質問を投稿した後、組織の制限が10000であることに気付きました。ページングルーチンが開始されると、クエリは無意味になります。私はどういうわけか自分自身を混乱させましたが order by recid asc limit 10000、それは全体としてwhere句の一部です。実際には、このlimit 10000部分は、レコードセットを要求された制限に制限することを除いて、レコードセットのコンテンツには関係ありません。したがって、ページングが開始されると、制限を10000に保つ意味はありません。これで時間を無駄にしてすみません。:(

4

5 に答える 5

1

最初の制限を取り除いてから、テーブルのカウントをわざわざ行わないでください。または、カウントと制限の小さい方、つまり10000を取得し、それに基づいてページネーションを行ってください。

すなわち

$perpage = 100;
$pages = $totalcount/$perpage;
$page = $get['Page'];
if($page > $pages || $page < 0)
{
     $page = 0;
}
$limit = "LIMIT " . ($page * $perpage) . ", " . $perpage;

合計数を計算するには、

SELECT COUNT(*) FROM mytable

それからあなたの限界に対してそれをチェックしてください、すなわち

if($totalcount > 10000)
{
    $totalcount = 10000;
}

専用のカウントクエリを実行する理由は、DBからPHPへのデータ転送がほとんど必要なく、多くのDBMSは、完全なテーブルSELECTクエリと比較してそのクラップを最適化できるためです。

于 2012-10-03T21:30:17.967 に答える
1

LIMITには2つの引数を指定できます。最初の引数はオフセットで、2番目の引数は返すレコードの数です。それで

LIMIT 5,10

最初の5レコードをスキップしてから、次の10レコードをフェッチします。

現在のページに基づいて制限を設定する必要があります。何かのようなもの

LIMIT (CURRENT_PAGE  -1) * PAGE_SIZE , PAGE_SIZE

したがって、ページごとに10個のレコードがあり、2ページ目にある場合は、最初の10個のレコードをスキップして、次の10個を取得します。

于 2012-10-03T21:34:51.500 に答える
1

オフセットの提案は素晴らしいものであり、おそらくそれを使用する必要があります。ただし、何らかの理由でオフセットがニーズに合わない場合(たとえば、誰かが新しいレコードを挿入するとページがわずかにシフトする場合)、クエリにwhererecid>####句を追加することもできます。これは、TwitterAPIを使用するときにページ分割する方法です。

これがPHPの例です。

    <?php
        $query = 'select recid from mytable';
        if(isset($_GET['recid'])&&$_GET['recid']!=''){
            $query = $query.' where recid > '.$_GET['recid'];
        }
        $query = $query.' order by recid asc limit 10000';

        //LOG INTO MYSQL

        $result = mysql_query($query);
        $last_id = '';

        while ($row = mysql_fetch_assoc($result)) {
             //DO YOUR DISPLAY WORK
             $last_id = $row['recid'];
        }

        echo '<a href="?recid='.$last_id.'>Next Page</a>';
   ?>

繰り返しますが、必要以上に複雑ですが、設定されたページが返されます。

于 2012-10-03T21:48:09.610 に答える
0

オフセット変数を使用できます。これが完全なクエリである場合は、次を使用できます。

select recid from mytable order by recid asc limit 100 offset 300

たとえば、300から399までの範囲で提供されます。そして明らかに、ページごとにオフセットを100ずつ増やします。したがって、最初のページのオフセット= 0、2番目のページのオフセット=100などです。

一般的なオフセット=(ページ-1)* 100

そして、@ Mathieu Lmbertが言ったように、オフセットが9900に達しないようにすることができます。

于 2012-10-03T21:27:53.343 に答える
-2

事実上、制限は1つだけであり、それはクエリに含まれている必要があります。したがって、唯一の解決策は、クエリのLIMIT句を調整することです。

あなたがすべきではないことは、あなたが望まない9900を捨てて、すべての10.000エントリを読むことです。

于 2012-10-03T21:28:28.180 に答える