golang,两种分页实例(1.mysql的limit分页。2.last_id分页)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值