我們使用分頁查詢時候經常會遇到需要對某個或者某幾個字段進行排序,在排序欄位有相同值的情況下有可能最後的排序結果不是我們預期的樣子,我們來看下乙個例子。
表裡面的creaet_datetime列的資料是有重複的,一般情況下我們分頁的sql是這樣的。
第一頁
第四頁
可以發現,id為8的這條資料出現在了第一頁和第頁當中,這樣就不是我們預期當中的結果。
那這是為什麼呢?
在我們以往的經驗和理解當中,這裡應該是先進行order by排好序,然後再取對應的分頁資料。其實在mysql5.7當中並不是這樣的,通過查閱 mysql5.7的官方文件可以發現在mysql5.7當中會對limit優化,我們提取最重要的資訊:
大概的意思就是 如果在order by列中有多個行具有相同的值,伺服器可以自由地以任何順序返回這些行,而且根據總體執行計畫的不同,返回順序也可能不同。換句話說,這些行對於非有序列的排序順序是不確定的。影響執行計畫的乙個因素是limit,因此帶有或不帶有limit的order by查詢可能會返回不同順序的行。
通過以上資訊我們就可以分析出,因為排序的字段是create_datetime,這個欄位的值是具有相同的值的,所以返回的行是隨機的。上面的情況就是查詢第一頁的時候id=8這行剛好排在前面,查詢第四頁的時候id=8這行剛好排在後面,所以不同的頁面出現了重複資料
官方的解決方式:
大概的意思就是 如果確保具有或不具有limit的相同行順序很重要,那麼在order by子句中包括額外的列,以使順序具有確定性,例如id值是唯一的。
那麼新增乙個排序欄位id,因為在表中id是有序唯一的,所以把查詢sql修改為
04 排序與分頁
如果沒有指定排序,順序按照新增順序顯示 不指定公升序降序,預設公升序 公升序asc,降序desc 排序 按照員工工資公升序排列 使用列名的別名進行排序 按照員工年工資排序 select employee id,salary 12 annual sal from employees order by ...
Mysql5 7安裝和配置
2 配置環境變數 我的電腦 屬性 高階 環境變數 path 如 d program files mysql mysql server 5.7 bin 注意是追加,不要覆蓋 3 修改my default.ini 僅僅修改不行的,需要複製乙份,叫my.ini 在其中修改或新增配置 mysqld base...
MySQL查詢 3 排序
為了方便檢視資料,可以對資料進行排序 語法 select from 表名 where order by 列1 asc desc 列2 asc desc,說明 例1 查詢未刪除學生的資訊,按名稱公升序 select from students where is delete 0 order by na...