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