一.mysql的limit分頁。
分頁配合排序
實例代碼:
func search(ctx iris.Context) {
//創建查詢Session
query := lib.Engine.Table("department")
//排序
if ctx.URLParamExists("sort") {
//這裏的sort一般是創建時間,比如create_at
sort := ctx.URLParam("sort")
//排序方法,order,desc或asc
order := strings.ToLower(ctx.URLParamDefault("order", "asc"))
switch order {
case "asc":
query.Asc(sort)
break
case "desc":
query.Desc(sort)
break
default:
ctx.JSON(lib.NewResponseFail(1, "order參數錯誤,必須是asc或desc"))
return
}
}
//分頁,size,單頁大小,page*size偏移量
page := ctx.URLParamIntDefault("page", 0)
size := ctx.URLParamIntDefault("size", 50)
query.Limit(size, page*size)
//查詢
var department []models.Department
err := query.Find(&department)
if err != nil {
ctx.JSON()
return
}
//
ctx.JSON()
}
二.last_id分頁
這裏的last_id與第一種稍有不同,第一種是傳統的web分頁,這裏是更適合移動端的分頁,比如上滑加載新的數據。
需要返回的數據:數據總數,total,本次數據集的最後一個記錄的last_id。需要接收的數據,last_id上次最後一條數據的id,page_size分頁大小,
思路:當第一次時,last_id爲-1或0,否則last_id爲上次數據的最後一個,然後用子查詢,獲取last_id後的數據。比如,
//last_id是具體數據,比如15
user.create_at<(select user.create_at from user where user.id=last_id)
實例代碼:
query := lib.Engine.Table("user")
//排序
if ctx.URLParamExists("sort") {
sort := "week_progress." + ctx.URLParam("sort")
order := strings.ToLower(ctx.URLParamDefault("order", "asc"))
switch order {
case "asc":
query.Asc(sort)
break
case "desc":
query.Desc(sort)
break
default:
ctx.JSON(lib.FailureResponse(lib.NilStruct(), "order參數錯誤,必須是asc或desc"))
return
}
}
//分頁:用last_id來做限制條件,而且使用last_id就不用page,使用最新的一頁
size := ctx.URLParamIntDefault("size", 5)
lastId := ctx.URLParamIntDefault("last_id", 0)
//跳過的數量
query.Limit(size, 0)
println("classId:", classId)
//當不是第一頁時
if lastId != 0 {
query.And("user.create_at<(select user.create_at from user where user.id=?)", lastId)
}
//查詢
var progressList []ProgressList
toatal, err := query..FindAndCount(&progressList)
if err != nil {
fmt.Printf("查詢用戶記錄錯誤:%v", err)
ctx.JSON()
return
}
//獲取last_id
retLastId := 0
if len(progressList) != 0 {
retLastId = progressList[len(progressList)-1].Id
}
resProgress := responseProgressList{progressList, toatal, retLastId}
//獲取total
ctx.JSON()
備註:使用分頁,數據必須是連續的,即create_at創建時間必須是有序的。
返回body實例:
{
"code": 200,
"data": {
"records": [
{
"id": 516,
"name": "1902"
},
{
"id": 513,
"name": "1901"
},
{
"id": 514,
"name": "1902"
},
{
"id": 515,
"name": "1901"
}
],
"total": 4,
"last_id": 515
},
"message": "獲取記錄成功"
}