データベースからのクエリの結果を段階的に表示する
-
05-07-2019 - |
質問
サイト内のすべてのユーザーのリストを表示したいのですが、年齢ごとに10人だけを表示したいです。私はこれを正確に行う方法を知りません。すべてのユーザーを1つのページに表示するだけでそれを行う方法を知っていますが、それはあまり良くありませんか?
現在使用しているコードを使用すると、最初の10人のユーザーのみが何度も取得されます。 一度のクエリですべてのユーザーを取得し、それをグローバルに保存してから、リスト内を移動して次の10個などを表示できるようにしたいと思います。
私は、JavaとSpring Frameworkを使用して、考えているソリューションのいくつかをappengineで開発しています
- セッションに保存してリストを確認します(非常に悪いと思います)
- それをJSP、特にスコープ、ページ、リクエストなどの1つに渡します。しかし、リクエストは機能しないと思います。
- これを処理できるSpringコントローラーを探します。
解決
一般的に言えば、ページで「GET」または「POST」を使用してフォーム変数を使用します。これは数字になります。サーブレットでそれを受け取ると、ページ番号とページごとの設定行に基づいて範囲を計算します。
大きなデータセットのページングをご覧ください(はい、Python同じ原則が適用されます)およびGoogleのクエリとインデックス App Engineのドキュメント。
他のヒント
ページサイズを10に維持すると、ページ番号に基づいて各ページの年齢グループごとに10人のユーザーを取得できます。
SELECT TOP 10 users FROM myusers
WHERE AGE = function(page_number)
ORDER BY some_ordering
JPA + appengineがそのような種類のクエリをサポートすることを願っています。
一部のデータベースエンジンは、この目的のためにSQLの便利な拡張機能を提供します。たとえば、MySQLでは、「select ... whatever ... limit 50,10」のように言うことができます。ここで、「50」はは、開始する行であり、10は取得する行の数です。次に、表示ページで、次のボタンと前のボタンを配置します。これらのボタンは、適切な開始行番号をサーバーに戻し、クエリでの次の実行に備えます。
使用しているSQLエンジンにそのような便利な機能がない場合は、クエリ固有の" where"を作成する必要があります。ソート順に基づく句。
簡単なケースとして、レコードを" user_name"の順に表示しているとします。 Statement.setMaxRows(10)を使用して、クエリを10行に制限できます。次に、最初の呼び出しで、「select ... what ... ... user order by user_name」と言います。最後に見つかったuser_nameを保存します。次のボタンで、このuser_nameをサーバーに返し、次の呼び出しのクエリは" select ... what ... user from where user_name> 'xxx' order by user_name&quot ;, where 'xxx'です前の呼び出しの最後のuser_name。再度setMaxRowsを実行して、出力が10行に制限されるようにします。その後、ユーザーにこの方法で出力全体をステップスルーさせることができます。
ユーザーを後進させることは少し苦痛です。各ページの開始キー値を含むセッション変数にテーブルを保持することで、これを実行しました。