2014年9月26日 星期五

MySQL 的 order by 不要模擬兩可,否則 limit 時可能出錯

做分頁功能時,常會用到 ... order by .... limit ...
但如果 order by 的條件,無法確定每一筆資料的先後順序,可能造成非預期的結果。

例如:
全部資料
「... order by bb」,結果如下
aa , bb
1    1
2    1
3    2
4    2
5    2


第 1 頁,取前三筆資料
「... order by bb limit 0,3」,結果如下
aa , bb
1    1
2    1
3    2


第 2 頁,取次三筆資料
「... order by bb limit 3,3」,預計結果如下
aa , bb
4    2
5    2
但有可能變成
aa , bb
3    2
4    2
=>「 5 , 2 」這筆不見了,但兩頁總筆數是對的。比對後,可發現「 3 , 2 」重覆列出,在第 1 頁、第 2 頁都列出了。


所以,order by 的條件要明確,避免分頁重覆列出某些資料,導致少列某些資料。

沒有留言:

張貼留言