2009-07-05 15 views
0

私は人がテーブルの行を見ることができるようなウェブサイトを持っています(各行は画像です)。 100,000以上の行があります。行の異なるサブセットを表示することができ、異なるソート順で表示することができます。行の1つを表示している間、「次へ」または「前へ」ボタンをクリックすると、リスト内の次の行または前の行に移動できます。MySQLの結果セットの[次へ]ボタンのための効率的なアルゴリズム

ウェブサイトの「次へ」と「前の」機能をどのように実装しますか?

具体的には、最大100,000行以上のリストを返す任意のクエリがあり、誰かが現在表示している行についての情報がわかっている場合、NEXT行を効率的にどのように判断するのですか?

ウェブサイトが若かったときに出てきた解決策の擬似コードは、1000行しかないときにうまくいきましたが、今では100,000行があると思います。

int nextRowId(string query, int currentRowId) 
{ 
    array allRowIds = mysql_query(query); // Takes up a lot of memory! 
    int currentIndex = (index of currentRowId in allRowIds); // Takes time! 
    return allRowIds[currentIndex+1]; 
} 

あなたはこの問題を考えている一方で、ウェブサイトは、単にそのID(結果セットの現在の行の例えば、位置)、この情報よりも現在の行に関する詳細な情報を保存できることを覚えておいてください次の行のIDを判別するためのヒントとして使用できます。

編集:この以前に言及していないため申し訳ありませんが、これは単なる静的なウェブサイトではありません:行は、多くの場合、リストに追加することができ、行がリストに再注文することができます。 (非常に希少で、行はリストから削除することができます)私はそのようなことについて心配する必要があると思いますが、そうでなければ私を説得することができます。

答えて

0

USeのmysql制限節。 as select * from tableA limit 0,100;

あなたは0と100を自然にパラメータ化し、必要なときにフォームに格納します。したがって、ユーザーが次へのヒット時に使用するオフセットを知ることができます。それはあなたがレンダリングする次の/前のページごとにクエリを再実行する必要があります。

+0

ありがとうございました!あなたの答えにも両方が当てはまるので、機械の答えに対する私のコメントを見てください。 –

4

クエリにLIMIT節を適用しようとしましたか?

LIMIT句は、SELECTステートメントによって返される行数を制限するために使用することができます。

MySQLのマニュアルからLIMITは、1つまたは2つの数値引数を取ります。これらは両方とも負でない整数定数でなければなりません(プリペアドステートメントを使用する場合を除く)。 2つの引数を指定して

、最初の引数を返すために、最初の行のオフセットを指定し、第一引数の値を指定すると

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15 

を返すように行の最大数を指定します結果セットの最初から返される行数:オフセット

SELECT * FROM tbl LIMIT 5;  # Retrieve first 5 rows 
+0

実際には、ウェブサイト上のリストをページングするときに限度があります。 –

+0

彼は、 '効率的な' - オフセット/リミットは、必要なものより前のすべての行を繰り返し、フィルタリングすることを必要とすると述べています。 –

+0

しかし、彼が現在使っていることを考えれば、DBMSにフィルタリング作業をさせ、必要な量のデータをクライアントに送り返すだけの巨大なステップです。とにかく、あなたの頭の上からより良い提案を得て、それを撃つ。 – PatrikAkerstrand

関連する問題