SQL同時用orderby和limit查詢的坑

2021-10-04 23:08:14 字數 1785 閱讀 7721

【今日推薦】:為什麼一到面試就懵逼!>>>

create table `newtable` (

`id`  int(11) not null auto_increment comment '部門id' ,

`partnerid`  int(11) not null comment '線下合作商id' ,

`department_name`  varchar(50) character set utf8mb4 collate utf8mb4_general_ci not null comment '部門名稱' ,

`addremark`  varchar(50) character set utf8mb4 collate utf8mb4_general_ci not null default '無備註' comment '新增部門備註' ,

`del`  tinyint(1) not null default 1 comment '關閉部門 預設1 關閉2' ,

`delremark`  varchar(50) character set utf8mb4 collate utf8mb4_general_ci not null default '無備註' comment '關閉部門備註' ,

`sort_num`  int(11) not null default 0 comment '排序 數字越大越靠前' ,

primary key (`id`)

)engine=innodb

default character set=utf8mb4 collate=utf8mb4_general_ci

comment='線下合作-部門(子公司)'

auto_increment=1

row_format=compact

;$sql = "

select

p1.`id`,p1.`department_name`,p1.`del` as delstatus,p1.sort_num

from

`t_partner_department` as p1

where

order by p1.`sort_num` desc

limit

";可以看到上面的sql語句是根據欄位sort_num來排序的,但我們新增部門資訊的時候是不會設定排序值的,預設為0,所以當使用上述sql語句查詢,由於sql排序值大多為0,而在排序相等的情況下,oeder by排序的順序是隨機的,而不是固定的,於是出現了資料丟失問題。

$sql = "

select

p1.`id`,p1.`department_name`,p1.`del` as delstatus,p1.sort_num

from `t_partner_department` as p1

where

order by p1.`sort_num` desc ,p1.`id` asc

limit ";

可以看到上面sql語句的oeder by排序除了根據sort_num降序,還根據id進行公升序,如果sort_num排序值相同,那麼則以id排序值為準;反之,如果sort_num排序值不同,則先按照sort_num排序,然後再把sort_num排序值相同的按照id排序。

通過排查,如果sql查詢不使用了order by和limit,輸出的資料是完整的,但是一旦使用它們來做資料分頁顯示並排序,如果order by的排序值大多相等,則會造成順序的不確定,因為在排序值相同的情況下,order by排序的順序是隨機的而不是固定的;因此,我們可以通過增加排序條件讓其排序結果是確定的、唯一的,這樣就能夠使得排序固定,而不出現資料丟失的問題。

SQL語句order by兩個字段同時排序問題

可能對不少來說非常簡單,但是我覺得在一定程度上對我還是有些迷惑之處,下面就通過hibernate中的hql語句來介紹下這類問題的效果。首先hql語句 from topic t where t.id 2 order by t.type desc,t.number desc也可以按照下面的寫法 from...

sql語句order by和union聯合使用

今天在產看查詢結果的時候,發現乙個問題,展現未按照既定的順序排列,看sql日誌未報錯,詳細看了下sql介紹才發現問題 如果是需要對於union後的結果進行order by 那麼sql語句的寫法應該是 select from a where name union select from a where...

Jpa條件查詢組合查詢and 和 or同時用

條件查詢,各個條件之間是and並且 關係,其中地理資訊省市區縣,例如河北省,要包括其下屬所有城市,每個城市包括下屬區縣,只選擇河北省時候,要查詢的是河北省所有的,他們之間是or 或者 關係 如果寫sql,很好完成where t.id 1 and t.name hbs and t.region 河北省...