【问题标题】:SQL/MySQL: common design of row number/index/offest for paginationSQL/MySQL:分页的行号/索引/偏移量的通用设计
【发布时间】:2011-05-14 21:37:49
【问题描述】:

我的挑战是我有一张桌子,例如在论坛中发帖,我想正确地获得 LIMIT 子句的偏移量。

为了说明这个例子: Table Post - 请记住 OFFSET 是行的编号/索引。

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-09
OFFSET 9: ID = 88, AUTHOR = ABC, CREATE_DATE = 2011-05-10

现在我想查询 ID = 45,我的分页结果应该是每页 5 个条目。

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

结果是 ID = 45 的一行。然后我想知道相对于表中总共 10 个条目的偏移量为 6。我想要每页 5 行,所以下面的语句 x = 5。

换句话说,我知道偏移量 = 6 的行位于结果页面的第二页,每页有 5 个条目。

SELECT Table.* FROM Table LIMIT x, 5

我怎么知道 x?

我的第一个想法是从表中获取所有 ID,然后查找正确的 ID,然后将偏移量除以 5。

问题:有没有更好的方法在 SQL 中执行此操作,因为对我来说这似乎是一个非常常见的挑战?

额外问题:SQL 解决方案很好;如果有区别,具体在MySQL中怎么做?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    通常最好将整个事情包装在一个包含多个查询的事务中。伪代码:

    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;
    

    【讨论】:

    • 我猜在将 id 添加到 where 子句时它可能会起作用,因为 create_date 对于很多条目可能是相同的。 (虽然我使用 datetime 作为 create_date)。
    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2021-10-14
    • 2011-04-01
    • 2015-03-15
    • 2023-03-28
    • 2011-12-07
    • 1970-01-01
    相关资源
    最近更新 更多