使用mysql实现分页(限制和偏移)
我正在实现一个RESTful api,它有一个需要支持分页的GET端点。为此,我实现了标准的limit和offset查询参数。当我访问(mysql)数据库时,我需要以有序、一致的方式获取数据。我尝试在查询中使用“order by”和“limit x,y”,但未返回预期结果 DDL/DML 以下是用于创建表/索引(ddl)和插入数据(dml)的(唯一)脚本:。文件内容如下:使用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
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)->
康纳问题准备得满分 如果我看到问题并理解正确,则问题在于您下的订单
限制
和偏移
有两种方式,
或者您明确提到限制
和偏移
如下:
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,如果我理解你的行为,你不能同时接受两个答案,但你只能对任何有贡献的答案投赞成票,这完全是你的选择。你可以在接受答案后,给出适当的理由,然后取消接受答案(正如我所说,这不是一条硬性规定,而是以我个人感觉更好的方式做事。)谢谢你的回复,我希望你能理解