質問

ページャーをそのアイテムのページにプリセットするために、大きなデータベーステーブル内のレコードのインデックス位置を見つける必要があります。この数値を得ることができる効率的な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がわかります。その後、カウントを使用し、単純な数学ですべてを照会せずに位置を取得できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top