使用mysql实现分页(限制和偏移)

使用mysql实现分页(限制和偏移),mysql,sql,pagination,limit,offset,Mysql,Sql,Pagination,Limit,Offset,我正在实现一个RESTful api,它有一个需要支持分页的GET端点。为此,我实现了标准的limit和offset查询参数。当我访问(mysql)数据库时,我需要以有序、一致的方式获取数据。我尝试在查询中使用“order by”和“limit x,y”,但未返回预期结果 DDL/DML 以下是用于创建表/索引(ddl)和插入数据(dml)的(唯一)脚本:。文件内容如下: CREATE TABLE ASSESSMENT( ISBN BIGINT NOT NULL , AUTHOR_FIRST

我正在实现一个RESTful api,它有一个需要支持分页的GET端点。为此,我实现了标准的limit和offset查询参数。当我访问(mysql)数据库时,我需要以有序、一致的方式获取数据。我尝试在查询中使用“order by”和“limit x,y”,但未返回预期结果

DDL/DML

以下是用于创建表/索引(ddl)和插入数据(dml)的(唯一)脚本:。文件内容如下:

CREATE TABLE ASSESSMENT(
  ISBN BIGINT NOT NULL
, AUTHOR_FIRST_NAME VARCHAR(32)
, AUTHOR_LAST_NAME VARCHAR(32)
, TITLE VARCHAR(128) NOT NULL
, NUMBER_OF_POINTS FLOAT NOT NULL
, IS_VERIFIED BOOLEAN DEFAULT FALSE
, READING_LEVEL FLOAT NOT NULL
, CREATED_TEACHER_ID MEDIUMINT
) ENGINE=INNODB DEFAULT CHARSET=latin1;


CREATE UNIQUE INDEX ASSESSMENT_X01 ON ASSESSMENT(
    ISBN
);

ALTER TABLE ASSESSMENT
ADD CONSTRAINT ASSESSMENT_PK PRIMARY KEY(
    ISBN
);

CREATE INDEX ASSESSMENT_X02 ON ASSESSMENT(
    TITLE
);

CREATE INDEX ASSESSMENT_X03 ON ASSESSMENT(
    CREATED_TEACHER_ID
);

INSERT INTO ASSESSMENT(ISBN, AUTHOR_FIRST_NAME, AUTHOR_LAST_NAME, TITLE, NUMBER_OF_POINTS, IS_VERIFIED, READING_LEVEL, CREATED_TEACHER_ID)
            VALUES(9781976530739, 'Herman', 'Melleville', 'Moby Dick', 65, FALSE, 10.8, 1);

INSERT INTO rc.ASSESSMENT(ISBN, AUTHOR_FIRST_NAME, AUTHOR_LAST_NAME, TITLE, NUMBER_OF_POINTS, IS_VERIFIED, READING_LEVEL, CREATED_TEACHER_ID)
            VALUES(0486282112, 'Mary', 'Shelley', 'Frankenstein', 22, FALSE, 12.0, 1);

INSERT INTO rc.ASSESSMENT(ISBN, AUTHOR_FIRST_NAME, AUTHOR_LAST_NAME, TITLE, NUMBER_OF_POINTS, IS_VERIFIED, READING_LEVEL, CREATED_TEACHER_ID)
            VALUES(1503275922, 'Joseph', 'Conrad', 'Heart of Darkness', 36, FALSE, 12.5, 1);

INSERT INTO rc.ASSESSMENT(ISBN, AUTHOR_FIRST_NAME, AUTHOR_LAST_NAME, TITLE, NUMBER_OF_POINTS, IS_VERIFIED, READING_LEVEL, CREATED_TEACHER_ID)
            VALUES(0679732764, 'Ralph', 'Ellison', 'Invisible Man', 30, FALSE, 9.8, 1);
SQL查询 为从评估表中检索条目而运行的查询位于:。为了方便起见,我还将其包括在下面

GET_ALL_ASSESSMENTS=SELECT ISBN,AUTHOR_FIRST_NAME,AUTHOR_LAST_NAME,TITLE,NUMBER_OF_POINTS,IS_VERIFIED,READING_LEVEL,CREATED_TEACHER_ID FROM ASSESSMENT ORDER BY ISBN ASC
GET_ASSESSMENT_LIMIT_OFFSET=SELECT ISBN,AUTHOR_FIRST_NAME,AUTHOR_LAST_NAME,TITLE,NUMBER_OF_POINTS,IS_VERIFIED,READING_LEVEL,CREATED_TEACHER_ID FROM ASSESSMENT ORDER BY ISBN ASC LIMIT :LIMIT, :OFFSET
GET_ASSESSMENT_COUNT=SELECT COUNT(1) FROM ASSESSMENT
预期结果 我的预期结果如下:

CREATE TABLE ASSESSMENT(
  ISBN BIGINT NOT NULL
, AUTHOR_FIRST_NAME VARCHAR(32)
, AUTHOR_LAST_NAME VARCHAR(32)
, TITLE VARCHAR(128) NOT NULL
, NUMBER_OF_POINTS FLOAT NOT NULL
, IS_VERIFIED BOOLEAN DEFAULT FALSE
, READING_LEVEL FLOAT NOT NULL
, CREATED_TEACHER_ID MEDIUMINT
) ENGINE=INNODB DEFAULT CHARSET=latin1;


CREATE UNIQUE INDEX ASSESSMENT_X01 ON ASSESSMENT(
    ISBN
);

ALTER TABLE ASSESSMENT
ADD CONSTRAINT ASSESSMENT_PK PRIMARY KEY(
    ISBN
);

CREATE INDEX ASSESSMENT_X02 ON ASSESSMENT(
    TITLE
);

CREATE INDEX ASSESSMENT_X03 ON ASSESSMENT(
    CREATED_TEACHER_ID
);

INSERT INTO ASSESSMENT(ISBN, AUTHOR_FIRST_NAME, AUTHOR_LAST_NAME, TITLE, NUMBER_OF_POINTS, IS_VERIFIED, READING_LEVEL, CREATED_TEACHER_ID)
            VALUES(9781976530739, 'Herman', 'Melleville', 'Moby Dick', 65, FALSE, 10.8, 1);

INSERT INTO rc.ASSESSMENT(ISBN, AUTHOR_FIRST_NAME, AUTHOR_LAST_NAME, TITLE, NUMBER_OF_POINTS, IS_VERIFIED, READING_LEVEL, CREATED_TEACHER_ID)
            VALUES(0486282112, 'Mary', 'Shelley', 'Frankenstein', 22, FALSE, 12.0, 1);

INSERT INTO rc.ASSESSMENT(ISBN, AUTHOR_FIRST_NAME, AUTHOR_LAST_NAME, TITLE, NUMBER_OF_POINTS, IS_VERIFIED, READING_LEVEL, CREATED_TEACHER_ID)
            VALUES(1503275922, 'Joseph', 'Conrad', 'Heart of Darkness', 36, FALSE, 12.5, 1);

INSERT INTO rc.ASSESSMENT(ISBN, AUTHOR_FIRST_NAME, AUTHOR_LAST_NAME, TITLE, NUMBER_OF_POINTS, IS_VERIFIED, READING_LEVEL, CREATED_TEACHER_ID)
            VALUES(0679732764, 'Ralph', 'Ellison', 'Invisible Man', 30, FALSE, 9.8, 1);
  • limit=1,offset=0->返回isbn最小的大小为1的返回列表
  • limit=1,offset=1->返回第二低isbn的大小为1的列表
  • limit=1,offset=2->返回第三个最低isbn的大小为1的列表
  • limit=1,offset=3->返回第四个最低isbn的大小为1的列表
  • limit=1,offset=x(x>=4)->返回一个空列表
  • limit=2,offset=0->返回大小为2且返回两个最低isbn的列表
  • limit=2,offset=1->返回大小为2的列表,并返回第二个/第三个最低isbn
  • limit=2,offset=2->返回第三个/第四个isbn的大小为2的列表
  • limit=2,offset=3->返回第四个最低isbn的大小为1的列表
  • 限制=2,偏移量=x(x>=4)->返回空列表
  • 限制=3,偏移量=0->返回具有三个最低isbn的大小为3的列表
  • limit=3,offset=1->返回第二个/第三个/第四个最低isbn的大小为3的列表
  • limit=3,offset=2->返回大小为2的列表,并返回第三/第四个最低isbn
  • limit=3,offset=3->返回isbn最低四分之一的大小为1的列表
  • 限制=3,偏移=x(x>=4)->返回空列表
  • limit=x,offset=0(x>=4)->返回大小为4的列表,其中包含所有isbn
  • limit=x,offset=1(x>=4)->返回大小为3的列表,并返回第二个/第三个/第四个最低isbn
  • limit=x,offset=2(x>=4)->返回大小为2的列表,并返回第三个/第四个最低isbn
  • limit=x,offset=3(x>=4)->返回大小为1、isbn最低四分之一的列表
实际结果

  • limit=1,offset=0->返回空列表(sql ran选择ISBN,作者姓名,作者姓氏,标题,分数,是否已验证,阅读级别,由ISBN ASC limit 1,0根据评估顺序创建的教师ID
  • limit=1,offset=1->大小为1的列表(sql ran选择ISBN、作者姓名、作者姓氏、标题、点数、是否已验证、阅读级别、根据ISBN ASC limit 1、1的评估顺序创建的教师ID)
  • 限制=1,偏移=2->大小2的列表
  • 限制=1,偏移=3->
  • 限制=1,偏移=x(x>=4)->
  • 限制=2,偏移=0->
  • 限制=2,偏移=1->
  • 限制=2,偏移=2->
  • 限制=2,偏移=3->
  • 极限=2,偏移=x(x>=4)->
  • limit=3,offset=0->空列表(sql ran*选择ISBN,作者姓名,作者姓氏,标题,分数,是否验证,阅读级别,根据ISBN ASC limit 3,0*的评估顺序创建的教师ID)
  • 限制=3,偏移=1->
  • 限制=3,偏移=2->
  • 限制=3,偏移=3->
  • 极限=3,偏移=x(x>=4)->
  • 极限=x,偏移=0(x>=4)->
  • 极限=x,偏移=1(x>=4)->
  • 极限=x,偏移=2(x>=4)->
  • 极限=x,偏移=3(x>=4)->
问题:

  • 我是否正确地创建了sql
  • 如果是,这是mysql的问题吗/我将如何解决这一问题以产生预期的结果
  • 如果我没有,我如何更正我的查询以产生预期的结果?它是否像翻转限额/偏移量那样简单
  • 欢迎就如何实现此功能提供任何一般性意见
  • 谢谢,
    康纳

    问题准备得满分

    如果我看到问题并理解正确,则问题在于您下的订单
    限制
    偏移

    有两种方式,

    或者您明确提到
    限制
    偏移
    如下:

    SELECT ISBN,AUTHOR_FIRST_NAME,AUTHOR_LAST_NAME,TITLE,NUMBER_OF_POINTS,IS_VERIFIED,READING_LEVEL,CREATED_TEACHER_ID 
    FROM ASSESSMENT 
    ORDER BY ISBN ASC LIMIT 1 OFFSET 0;
    

    如果您不想明确提到单词
    offset
    ,我们需要首先传递
    offset
    值,然后传递
    limit
    值作为

    SELECT ISBN,AUTHOR_FIRST_NAME,AUTHOR_LAST_NAME,TITLE,NUMBER_OF_POINTS,IS_VERIFIED,READING_LEVEL,CREATED_TEACHER_ID 
    FROM ASSESSMENT 
    ORDER BY ISBN ASC LIMIT 0,1;
    

    另外,我没有像你提到的那样测试每一个案例,但我认为如果我的理解正确,你现在知道该怎么做了。

    你有向后的
    LIMIT*OFFSET*,*ROW\u COUNT*
    或者,您可以使用
    OFFSET

    所以这个查询可能是

    SELECT * FROM Table LIMIT 0, 1
    


    谢谢Sujitmohanty30,我已经继续并翻转了参数,看起来这解决了问题。这确认了您的答案。感谢您的帮助和确认!(接受并投票)@康纳·布奇,我可以知道不接受答案的原因吗?我错了吗?你已经确认并接受了答案?这似乎是不正确的行为。很抱歉,其他人发表了评论,我也接受了他们的评论,我想这也不被你接受(我不经常在这里,所以我不知道你一次只能接受一个答案)。我再次接受了你的回答,因为这是第一次。@Connor Butch,如果我理解你的行为,你不能同时接受两个答案,但你只能对任何有贡献的答案投赞成票,这完全是你的选择。你可以在接受答案后,给出适当的理由,然后取消接受答案(正如我所说,这不是一条硬性规定,而是以我个人感觉更好的方式做事。)谢谢你的回复,我希望你能理解