2016-08-07 8 views
0

私はニュース付きのテーブルを持っています。このテーブルをnewsとしましょう。ユーザの束がnewsに新しい行を継続的に挿入しています。現在ニュースフィードを閲覧しているユーザー(newsのデータ)。ユーザーが最初のページをブラウズしている間に、他のユーザーがそれ以上のデータを挿入している間に、ページングの一貫性を維持する方法を考えてください。最初のページに18のニュースがある場合は、OFFSET 18を使用する必要がありますが、この場合、新しいニュースが既に挿入されているため、間違ったデータを取得します。ポストグル:動的オフセット

ページネーションを正しく実装するにはどうすればよいですか?

+0

ページ挿入は、ニュース挿入のタイムスタンプによって順序付けられますか?行に一意のIDがありますか? –

+0

@ClodoaldoNetoでは、行にはuidと挿入タイムスタンプの両方があります。私はページシフトをオフセットの代わりに挿入タイムスタンプに基づいて行うべきですか?一意のタイムスタンプを持つ複数の行を持つことは可能でしょうか?つまり、1つのテーブル内にある場合は、1つの行を1つのmsより速く挿入できますか? – stkvtflw

答えて

1

アプリケーション・クライアントでページの最新かつ最も古い行のタイム・スタンプを入力します。それはWebアプリケーションであれば、nextpreviousリンクはのようになります。

(
    select * 
    from (
     select * 
     from news 
     where ts > :newest 
     order by ts 
     limit 20 
    ) s 
    order by ts desc 
) 
union all 
(
    select * 
    from news 
    where ts < :oldest 
    order by ts desc 
    limit 20 
) 

<a href="/news?newest=2016-08-06+20%3A17%3A05.882252%2B00">Previous</a> 
<a href="/news?oldest=2016-08-05+20%3A17%3A05.882252%2B00">Next</a> 

次にあなたがnullとしてクエリや他のクライアントから受信した1の値を渡します

2つの挿入が同じミリ秒で起こることはほとんどありません。

+0

私はGUID v4を使用しているので、 '> '演算子は適用されません。 – stkvtflw

+0

@stkvtflwバグ修正 –

関連する問題