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": "獲取記錄成功"
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章