質問
ページャーをそのアイテムのページにプリセットするために、大きなデータベーステーブル内のレコードのインデックス位置を見つける必要があります。この数値を得ることができる効率的なSQLクエリが必要です。悲しいことに、SQLは次のようなものを提供しません:
SELECT INDEX(*) FROM users WHERE userid='123'
素晴らしいアイデアはありますか
EDIT:これにORDER BY句が追加されていると仮定しましょう。ポイントは、特定のレコードの位置を特定するためにすべてのレコードをロードする必要はないということです。以前に選択した既存のアイテムを保持しているページにページャーを開こうとしています-ユーザーが別のアイテムを選択できるようにするコンテキスト内で、既に選択したアイテムに関する情報を提供したいので。
解決
(pseudo-code)のようなものを使用できます:
- カウントクエリ:$ n = select user(uid)from {users} where ...(制限としてuserid 123を含むページング条件)
- $ page = floor($ n / $ pager_size);
- クエリの表示:what、you、want、{users} where(制限なしのページング条件)を選択し、db_query_range(thequery、$ page、$ pager_size)に渡します
pager_query を実際に見る必要があります。基本的には、カウントクエリと表示クエリのように機能しますが、カウントクエリを自動的に構築しようとします。
他のヒント
SQL Server 2005以降でレコードをページングする方法を本当に求めていると仮定して、 David Hayden :
(日付、説明を列に変更する必要があります)
CREATE PROCEDURE dbo.ShowUsers
@PageIndex INT,
@PageSize INT
AS
BEGIN
WITH UserEntries AS (
SELECT ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row, Date, Description
FROM users)
SELECT Date, Description
FROM UserEntries
WHERE Row BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize
END
SQLは、OrderBy句を使用しない限り、テーブル内のオブジェクトの順序を保証しません。つまり、特定の行のインデックスは、後続のクエリで変更される可能性があります。ページャーで達成しようとしていることを説明できますか?
をシミュレートするものに興味があるかもしれませんMySQLのOracleの rownum()
...質問で指定されていないのでもちろんMySQLを使用している場合。
注:
もちろんそれが機能するためには、ページのすべての記録を調べる必要があります。データベースサーバーからPHPページにそれらを取得する必要はありませんが、クエリに含める必要があります。 where条件、順序、およびグループにより変更される可能性があるため、結果セットを照会する以外に、結果セット内の行の位置を決定する魔法のトリックはありません。コンテキスト内にある必要があります。
もちろん、すべての行がシーケンシャルで、増分IDがある場合、どれも削除されず、最初と最後のIDがわかります。その後、カウントを使用し、単純な数学ですべてを照会せずに位置を取得できます。