29

特定の日付のデータベース テーブルに 500 を超える行があります。

特定の日付で行を照会するには。

select * from msgtable where cdate='18/07/2012'

これは 500 行を返します。

これらの 500 行 x 10 行を段階的にクエリする方法。最初の 10 行をクエリしてブラウザに表示し、次の 10 行をクエリしてブラウザに表示しますか?

4

7 に答える 7

66

LIMIT句を使用するだけです。

SELECT * FROM `msgtable` WHERE `cdate`='18/07/2012' LIMIT 10

そして、次の呼び出しから、次の方法で実行できます。

SELECT * FROM `msgtable` WHERE `cdate`='18/07/2012' LIMIT 10 OFFSET 10

OFFSETおよびの詳細については、 を参照LIMITLIMITOFFSETください。

于 2012-09-18T13:29:01.717 に答える
12

LIMIT limit OFFSET offset動作します。

ただし、安定したORDER BYが必要です。そうしないと、次の呼び出しで値の順序が異なる場合があります(たとえば、テーブルへの書き込み後)。

SELECT *
FROM   msgtable
WHERE  cdate = '2012-07-18'
ORDER  BY msgtable_id  -- or whatever is stable 
LIMIT  10
OFFSET 50;  -- to skip to page 6

標準準拠の日付スタイル (私の例では ISO 8601 ) を使用してください。これは、ロケール設定に関係なく機能します。

関連する行が関連する列で挿入、削除、または変更された場合でも、ページングは​​シフトします。それはしなければなりません。

そのシフトを回避したり、大きなテーブルでパフォーマンスを向上させたりするには、よりスマートなページング戦略を使用してください。

于 2012-09-18T13:55:05.060 に答える
2
SET @rownum = 0; 
SELECT sub.*, sub.rank as Rank
FROM
(
   SELECT *,  (@rownum := @rownum + 1) as rank
   FROM msgtable 
   WHERE cdate = '18/07/2012'
) sub
WHERE rank BETWEEN ((@PageNum - 1) * @PageSize + 1)
  AND (@PageNum * @PageSize)

@PageNumパラメータを渡すたび@PageSizeに、必要な特定のページを取得します。たとえば、最初の 10 行は次のようになります。@PageNum = 1 and @PageSize = 10

于 2012-09-18T13:30:00.233 に答える
0

postgresql カーソルを使用できます

BEGIN;
DECLARE C CURSOR FOR where * FROM msgtable where cdate='18/07/2012';

次に使用します

FETCH 10 FROM C;

10行をフェッチします。

フィンランド語

COMMIT;

カーソルを閉じます。

ただし、異なるプロセスでクエリを作成する必要がある場合は、@ Praveen Kumar が提案する LIMIT と OFFSET の方が優れています

于 2012-09-18T13:30:36.193 に答える
0

Ok。したがって、ページネーションを実装するだけでよいと思います。

$perPage = 10;

$pageNo = $_GET['page'];

データベース内の合計行を見つけます。

$totalRows = Get By applying sql query;

$pages = ceil($totalRows/$perPage);    

$offset = ($pageNo - 1) * $perPage + 1

$sql = "SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT ".$offset." ,".$perPage
于 2017-05-23T08:42:13.347 に答える