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