ページングのソートで気をつけること
バックエンドの実装で、ページングしたデータを返す際の話。
基本ライブラリに頼っているのであまり実装のことを考えたことがなかったので、結構苦戦した。
以下のような数字を降順で並べたリストのデータを、ページングでフロントエンドに返すとする。
7,6,5,4,3,2,1,0
ページごとの件数が3だとすると、1ページ目は7,6,5
、2ページ目は4,3,2
となる。
このときSQLを用いたデータベースへのアクセスだが、1ページ目から2ページ目の遷移は簡単で端っこの値を基に比較演算子を用いる。(5 > X)
3ページ目から2ページ目への遷移はどうだろう。
1,0
から4,3,2
を取得したい。
このときのポイントとして、全体の並び順が降順であってもDBから取得する際に並べ替えてからLIMITで件数を試ぼってはいけない。
1
より大きい値を降順で3件欲しいわけだが、単純に1
より大きい値を降順で3件要求すると取得できる値は7,6,5
となってしまう。
要するにASCで3件取得した後にDESCで並べ替えなければいけないのだ。
ちなみに昇順でも同じように、前ページを取得する際には取得後の並べ替えでないといけない。
0,1,2,3,4,5,6,7
0,1,2
->3,4,5
ASCで取得可能
6,7
->3,4,5
DESCで3件取得した後にASCで並べ替え
きっとすぐに忘れるので、ちょっとでも考えるヒントになるように備忘録として残しておく。