神隠しに遭います。
たとえば、説明会の一覧ページをページネーション付でつくったとします。
簡略化のため、説明会は、
- 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
勉強になりました。