一.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": "获取记录成功"
}