在寫接口分頁時遇到了一個 order by 與 limit 同時用的時候出現的問題? 當分頁查詢出的數據會有重復的,差了好多資料,都將矛頭指向了MySQL
資料:
如果order by的字段有多個行都有相同的值,mysql是會隨機的順序返回查詢結果的,具體依賴對應的執行計劃。也就是說如果排序的列是無序的,那么排序的結果行的順序也是不確定的。
基于這個我們就基本知道為什么分頁會不準了,因為我們排序的字段是“is_top”,正好又有幾個相同的值的行,在實際執行時返回結果對應的行的順序是不確定的。對應上面的情況,第一頁返回的name為8的數據行,可能正好排在前面,而第四頁查詢時name為8的數據行正好排在后面,所以第四頁又出現了。
造成原因:
因為數據庫同一字段的值是有多條數據相同的,“order by 字段名” 再加上 “limit” 就會出現問題了
解決辦法:
找一個唯一的字段加在 order by 中
如果想在Limit存在或不存在的情況下,都保證排序結果相同,可以額外加一個排序條件。例如id字段是唯一的,可以考慮在排序字段中額外加個id排序去確保順序穩定。
所以上面的情況下可以在SQL再添加個排序字段,比如id字段,這樣分頁的問題就解決了。修改后的SQL可以像下面這樣:
SELECT * FROM user ORDER BY is_top,id LIMIT 6,2;