前言
在實踐中我們會遇到這樣的問題,知道某條記錄的id,然后需要判斷此條記錄如果按照id進行排序分頁,此條記錄在第幾頁。今天這篇文章為大家提供一個思路。
下面話不多說了,來一起看看詳細的實現(xiàn)方法吧
根據(jù)ID查詢分頁位置
根據(jù)ID來查詢分頁位置,比如按照ID的倒序排列,則可通過以下SQL查詢出大于此ID記錄數(shù):
select count(id) from user where id > 5;
示例中user為表名,5位待匹配的id。很顯然,因為是倒序排序只需查找大于此id的記錄數(shù)即可,如果是正序排列,則小于此id即可。
當(dāng)查出count值之后,怎么計算當(dāng)前記錄位于第幾頁呢,這里以java代碼示例計算:
int pageSize = 10;
// 假設(shè)上面查出的結(jié)果為count,值為11
int count = 11;
// 計算當(dāng)前記錄所在的pageNum
// 通過取模并加1獲得當(dāng)前頁數(shù)為第2頁
int pageNum = count/pageSize + 1;
// 如果想進一步獲得在某頁的某個位置,則再進行取余即可,即第2頁的第1條記錄(從0開始)
int index = count%pageSize;
多維度排序定位
上面通過簡單的ID進行排序還是比較好解決的,那么如果現(xiàn)在查詢某條記錄排序的維度不僅僅是ID,比如先按照年齡(age)進行倒序排序,如果age相同,則再跟進ID進行倒序排序。基本的sql語句如下:
select id, age from user order by age desc,id desc;
此時我們知道某條id為5,age為18的記錄,如何確定出此條記錄在多條件排序中的位置呢。
首先,多條件排序的難度在于age相同的情況,如果age不相同,只需如下sql即可像《根據(jù)ID查詢分頁位置》一樣定位出id的位置:
select count(id) from user where age > 18;
這樣就可以查詢出來此組合排序age不相同時此條記錄的位置,具體位置的算法同第一種情況。
那么當(dāng)age用重復(fù)的情況如何處理呢。當(dāng)然,可以通過復(fù)雜的關(guān)聯(lián)查詢或子表查詢來實現(xiàn),這里通過另外一種方式,就是再查詢一下age相同,并且id大于當(dāng)前用戶的記錄條數(shù):
select count(id) from user where age = 18 and id > 5;
上面獲得了age相同情況下,并且id大于5的記錄,將第一步和第二步的統(tǒng)計結(jié)果相加,問題是不是又回到了《根據(jù)ID查詢分頁位置》的簡單模式了,還是同樣的算法可以算出當(dāng)前記錄位于第幾頁了。
此種方案雖然查詢了兩次數(shù)據(jù)庫,如果很好的建立索引,比關(guān)聯(lián)查詢或子查詢要方便、簡潔和高效一些。
小結(jié)
以上是在實踐中遇到類似問題的兩個思考維度,希望能給大家?guī)硪粋€突破,同時也希望大家提供更好的方案。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
您可能感興趣的文章:- 淺談mysql的子查詢聯(lián)合與in的效率
- 詳解Mysql多表聯(lián)合查詢效率分析及優(yōu)化
- 對MySQL幾種聯(lián)合查詢的通俗解釋
- Mysql聯(lián)合查詢UNION和UNION ALL的使用介紹
- Mysql聯(lián)合查詢UNION和Order by同時使用報錯問題的解決辦法
- mysql多表聯(lián)合查詢返回一張表的內(nèi)容實現(xiàn)代碼
- mysql使用from與join兩表查詢的區(qū)別總結(jié)
- Mysql查詢正在執(zhí)行的事務(wù)以及等待鎖的操作方式
- MySQL查詢中LIMIT的大offset導(dǎo)致性能低下淺析
- Mysql兩表聯(lián)合查詢的四種情況總結(jié)