2017-01-17 8 views
0

メッセージアーカイブアプリケーションでは、メッセージサブジェクトのテーブルを効率的にページ付けしたいと考えています。これは私がちょうど日付でソートすれば十分です。私はページに表示された最初と最後の日付を覚えておき、それより大きいか小さいメッセージのセットを問い合わせることができます。しかし、このアプリケーションでは、いくつかのメッセージを固定することができます。メッセージが昇順または降順にソートされているかどうかにかかわらず、常に他のメッセージの前に表示する必要があります。 boolがレコード上でtrueに設定されている場合、メッセージは固定されます。2つのキーでソートするときのSQLページング

これを効率よくページングするにはどうすればよいですか?テーブルが非常に大きく、自由にメッセージを追加したり削除したりすることができます。私たちはPostgresを使っています。

編集:私が望むものを得るために注文する方法を知っています。問題は、結果をページ分割するのに最適な方法です(OFFSETを使用しない)。

+0

'order by boolean_column、date' –

+0

「固定」とはどういう意味ですか?特定のメッセージが常に同じ位置に表示されることを意味しますか?私たちに例を挙げてもらえますか? –

+0

メッセージが固定されている場合は、メッセージを並べ替えるときに最初に表示されることを意味します。 –

答えて

1

ソートようなORDER BY句でメッセージとget最初の50のエントリ:

ORDER BY NOT pinned, create_timestamp LIMIT 50 

は最後(NOT pinned, create_timestamp)組み合わせを覚えておいてください。

は、次のページを取得し、次のページのため

WHERE (NOT pinned, create_timestamp) > (last_notpinned, last_createts) 
ORDER BY NOT pinned, create_timestamp LIMIT 50 

などを使用します。

あなたはこのすべてを効率的にするために

CREATE INDEX ON tablename ((NOT pinned), create_timestamp); 

のような指標が必要になります。

+0

Postgresを使用している人のためのメモ。インデックスを作成するときにNOTのような演算子を使用するときは、次のようにかっこで囲む必要があります: 'CREATE INDEX ON tablename(固定されていない、create_timestamp);' –

+0

ありがとう、私はそれらを追加しました。 –

関連する問題