开发者

SQL/MySQL: common design of row number/index/offest for pagination

开发者 https://www.devze.com 2023-03-06 09:29 出处:网络
My challenge is that I have a table of e.g. posts in a forum and I want to get the offset for LIMIT clause right.

My challenge is that I have a table of e.g. posts in a forum and I want to get the offset for LIMIT clause right.

To illustrate the example: Table Post - please remember OFFSET is the number/index of the row.

OFFSET 0: ID = 17, AUTHOR = ABC, CREATE_DATE = 2011-05-01
OFFSET 1: ID = 39, AUTHOR = ABC, CREATE_DATE = 2011-05-02
OFFSET 2: ID = 77, AUTHOR = ABC, CREATE_DATE = 2011-05-03
OFFSET 3: ID = 78, AUTHOR = ABC, CREATE_DATE = 2011-05-04
OFFSET 4: ID = 99, AUTHOR = ABC, CREATE_DATE = 2011-05-05
OFFSET 5: ID = 33, AUTHOR = ABC, CREATE_DATE = 2011-05-06
OFFSET 6: ID = 45, AUTHOR = ABC, CREATE_DATE = 2011-05-07
OFFSET 7: ID = 11, AUTHOR = ABC, CREATE_DATE = 2011-05-08
OFFSET 8: ID = 13, AUTHOR = ABC, CREATE_DATE = 2011-05-0开发者_C百科9
OFFSET 9: ID = 88, AUTHOR = ABC, CREATE_DATE = 2011-05-10

Now I want to make query for ID = 45, and my pagination should give a result of 5 entries per page.

SELECT Table.* FROM Table WHERE Table.id = 45 ORDER BY Table.create_date;

Result is one row with ID = 45. And then I want to know that the offset is 6 in relation to the 10 entries in total in the table. I want 5 rows per page, so x = 5 for the following statement.

In other words I know the the row with offset = 6 is on the 2nd page of the results page with 5 entries per page.

SELECT Table.* FROM Table LIMIT x, 5

How do I know x?

My first idea is that I fetch all IDs from the table and just look for the right ID and then divide the offset by 5.

Question: Is there a better way to do this in SQL because to me this seems like a very common challenge?

Bonus question: SQL solution is fine; how to do it in MySQL specifically if there is a difference?


You're usually better off wrapping the whole thing in a transaction with multiple queries. Pseudocode:

select count(*) from table
where create_date <= (select create_date from table where id = 45);

select table.* from table order by create_date limit 5 offset :offset;
0

精彩评论

暂无评论...
验证码 换一张
取 消