Mysql排序分頁查詢兩頁資料重複問題

2021-10-11 09:46:02 字數 1018 閱讀 6718

問題描述

資料分頁時需要根據資料記錄建立時間create_time欄位倒序,即使用order by create_time desc limit ?,?,但是我們會發現,前端進行請求時獲取的資料並不正確,分頁**現了一定的重複資料。

問題原因

期初還很好奇,總數沒問題,總查詢也沒問題,為什麼資料會重複了,然後會把部分資料給覆蓋了。後來,通過檢視sql發現,是根據時間進行排序的,然而 這個時間 恰恰 好多資料都是 同一時間插入,或者 設定的 同一時間。

先後執行 總查詢(也就是不分頁),是沒有重複。

再次執行分頁查詢,分兩頁查詢就有了出路。(且,兩次查詢出來的資料和總查詢資料不一樣了)

後來 發現,當sql中order by待排序字段值相同時,系統對資料的排序可能變得隨機,即一會兒這條資料在前面,一會兒這條資料在後面了 ,所以當翻頁的時候我們很容易便看到了重複的資料。

sql中order by相同值結果亂序的具體原因

查閱了goole和相關資料,大概總結了這種情況的原因。其實發生這種現象是「故意」設計的。

如果沒有指定order by語句,則 mysql (或任何rdbms)不保證以特定順序返回結果。 有些人認為,如果沒有指定order by子句,行總是以聚簇索引順序或物理磁碟順序返回。 然而,這是不正確的,因為在查詢處理期間可以改變行順序的許多因素,例如並行的hash連線是更改行順序的操作符的乙個很好的例子。

如果指定order by語句,mysql將對行進行排序,並按請求的順序返回。 但是,如果該順序不是確定性的,即可能有重複的值,則在每個具有相同值的組中,由於與上述相同的原因,該順序是「隨機的」。

確保確定性順序的唯一方法是在order by子句中包含保證的唯一列或列組(例如主鍵)。

select member_id,create_time from member order by create_time desc,id;
總結

為了避免類似的問題,我們可以將主鍵(或者具有唯一性的字段)排序引入需要排序的業務欄位後即可解決 。

Hibernate 框架分頁出現兩頁資料重複問題

表中沒有唯一鍵 create or replace table name1 varchar 100 name2 varchar 100 qty1 int 在hibernate框架中經常會使用到框架本身的分頁查詢功能,下面是查詢表 table 的所有資料,備註 表 table 沒有 唯一 鍵 stri...

SQL分頁資料查詢

在許多資料庫應用系統中,會對資料進行大量的查詢操作。當查詢資料量比較大時查詢所用的時間就會變得較慢,所以我們希望可以分批的獲取資料。特寫了乙個儲存過程用於分批獲取資料。鑑於游標效率低,故此處沒有採用。create procedure selectpage tablename nvarchar 64 ...

mysql 查詢排序 分頁查詢

1.排序 排序方式 說明asc 按公升序排列 預設 desc 按降序排序 1.按age排序 select from students order by age 2.按age降序,若age相同,按height降序排序 select from students order by age desc hei...