1

ページャーをアイテムのページにプリセットするために、大規模なデータベース テーブル内のレコードのインデックス位置を特定する必要があります。この数値を取得できる効率的な SQL クエリが必要です。残念ながら、SQL は次のようなものを提供していません。

SELECT INDEX(*) FROM users WHERE userid='123'

明るいアイデアはありますか?

編集: これに ORDER BY 句が追加されていると仮定しましょう。ポイントは、特定のレコードの位置を見つけるためにすべてのレコードをロードする必要がないことです。ユーザーが別の項目を選択できるコンテキスト内で、既に選択されている項目に関する情報を提供したいため、以前に選択された既存の項目を保持しているページにページャーを開こうとしています。

4

4 に答える 4

3

(擬似コード)のようなものを使用するかもしれません:

  • カウントクエリ:$ n = select count(uid)from {users} where ...(ユーザーID 123を制限として含むページング条件)
  • $ page = floor($ n / $ pager_size);
  • クエリの表示:db_query_range(thequery、$ page、$ pager_size)に渡された{users} where(制限なしのページング条件)から何をしたいかを選択します

ただし、実際にはpager_queryを確認する必要があります。これがすべてであり、基本的には次のように機能します。カウントクエリと表示クエリですが、カウントクエリを自動的に作成しようとする点が異なります。

于 2009-03-06T13:00:23.340 に答える
1

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 
于 2009-03-06T06:02:31.130 に答える
0

OrderBy 句を使用しない限り、SQL はテーブル内のオブジェクトの順序を保証しません。つまり、特定の行のインデックスは、後続のクエリで変更される可能性があります。ページャーで何を達成しようとしているのか説明できますか?

于 2009-03-06T04:26:40.877 に答える
0

MySQL で Oracle をシミュレートするrownum()ものに興味があるかもしれません...質問で指定されていないため、もちろん MySQL を使用している場合。


:

もちろん、それが機能するには、ページのすべてのレコードを調べる必要があります。それらをデータベース サーバーから PHP ページに戻す必要はありませんが、それらをクエリに含める必要があります。where 条件、順序、およびグループが原因で変更される可能性があるため、結果セットをクエリする以外に、結果セット内の行の位置を決定するための魔法のトリックはありません。それは文脈にある必要があります。

もちろん、すべての行が連続しており、ID が増分されている場合、何も削除されず、最初と最後の ID がわかります。次に、カウントを使用して、すべてを照会せずに簡単な数学で位置を取得できます....しかし、それがあなたのケースであるとは思えません。

于 2009-03-06T04:46:36.257 に答える