MySQL中order by 與 limit 同時用的數據重復問題

在寫接口分頁時遇到了一個 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;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,839評論 0 11
  • 在Mysql中我們常常用order by來進行排序,使用limit來進行分頁,當需要先排序后分頁時我們往往使用類似...
    丘八老爺閱讀 25,439評論 6 20
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 說實話,我是個很守舊的人。社會發展到現在,我對很多新生事物多采取觀望謹慎的態度。很多朋友,包括親戚都埋怨我,太落伍...
    微言微評閱讀 429評論 0 0