5

初歩的な質問で申し訳ありません。現在、sqlite データベースを背後に持つ perl Web アプリケーションを作成しています。数千行を取得する可能性のあるアプリのクエリ結果を表示できるようにしたいと考えています。これらはページに分割する必要があります。ルーティングは /webapp/N のようにする必要があります。N はページ番号です。関連する行のみを取得するために、DBI を使用して sqlite db をクエリする正しい方法は何ですか。

たとえば、1 ページあたり 25 行を表示する場合、最初のページで 1 ~ 25 行、2 ページ目で 26 ~ 50 行などをデータベースにクエリしたい場合などです。

4

4 に答える 4

7

LIMIT/OFFSET構造を使用するとページが表示されますOFFSETが、クエリが非効率になり、データが変更されるとページのコンテンツが移動します。

次のページのように、最後のページが終了した位置から次のページがクエリを開始すると、より効率的で一貫性があります。

SELECT *
FROM mytable
ORDER BY mycolumn
WHERE mycolumn > :lastvalue
LIMIT 25

これは、リンクがしかしではないことを意味し/webapp?Page=Nます/webapp?StartAfter=LastKey

これについては、スクロール カーソルのページで詳しく説明しています。

于 2012-10-22T19:03:40.973 に答える
3

次のようなことをする必要があります。

SELECT column FROM table ORDER BY somethingelse LIMIT 0, 25

ユーザーが2ページをクリックしたら、次のことを行う必要があります。

SELECT column FROM table ORDER BY somethingelse LIMIT 25, 50

等々..

于 2012-10-22T16:58:53.307 に答える
2

次のような LIMIT および OFFSET キーワードを使用する可能性が最も高いでしょう。

$sth->prepare("SELECT foo FROM bar WHERE something LIMIT ? OFFSET ?");
$sth->execute($limit, $offset);
while ( my @row = $sth->fetchrow_array ) { # loop contains 25 items

$limitおよび変数は$offset、html/cgi/whatever 機能によってスクリプトに渡されるパラメーターによって制御されます。

于 2012-10-22T17:10:49.890 に答える
1

ページネーションは、多くの CPAN モジュールがすでに解決している問題の 1 つです。ストレート SQL を使用している場合は、DBIx::Pagerのようなものを見ることができます。さまざまなページへのリンクの作成を管理するのに役立つData::Pagesetのようなものをチェックすることもできます。SQL クエリに DBIx::Class (優れたツール) を使用している場合、DBIx::Class::ResultSet::Data::Pagesetを使用すると、これが非常に簡単になります。

基本的に SQL を処理することはその 1 つの目的ですが、そのテンプレートの側面でさまざまな問題を解決する必要もあります。これらのモジュールを確認し、CPAN をもう少し調べて、ページネーションに関して他の誰かがすでにあなたのために大変な作業を行っている場所を確認することをお勧めします。

于 2012-10-23T13:19:10.887 に答える