8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PostgreSQL で pagination とかやるときは order をちゃんと指定おいた方がよいよ。

Last updated at Posted at 2016-11-22

神隠しに遭います。

たとえば、説明会の一覧ページをページネーション付でつくったとします。
簡略化のため、説明会は、

  • id
  • date (開催日)
  • time (開始時刻)

のデータを持っているとします。

例えば、seminars テーブルの 開催日が 11月2日は以下の2つのレコードを持っています。

seminar_id date time
5 2016-11-2 8:00
6 2016-11-2 9:00

そして、以下のページネーションのように、order に date だけを指定しまった場合(timeは指定しなかった場合) 神隠しに遭うことができます。

1ページ目

発行されるSQL
select * from seminars order by date asc limit 5 offset 0
seminar_id date time
1 2016-11-1 6:00
2 2016-11-1 7:00
3 2016-11-1 9:00
4 2016-11-1 8:00
6 2016-11-2 9:00

そうすると2ページ目がこんな感じなったりします。

2ページ目

発行されるSQL
select * from seminars order by date asc limit 5 offset 5
seminar_id date time
6 2016-11-2 9:00
7 2016-11-3 6:00
8 2016-11-3 7:00
9 2016-11-3 8:00
10 2016-11-3 9:00

「seminar_id = 5 はどこへ行った??」 となります。

order を指定しないと順序が保証されない

この辺が参考になると思いますが。

一意に決まる order を設定しないと、上のようなことが起こりえます。

修正したSQL
select * from seminars order by date asc, time asc limit 5 offset 5

勉強になりました。

8
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?