Mysql无偏移分页

标签 mysql sql pagination

假设我有一个包含这些数据的表:

Table data

我想通过createdAt列DESC和id列DESC来排序

select id, createdAt from post order by createdAt desc, id desc

现在看起来像这样:

ORDER BY createdAt DESC, id DESC

我想用每页 2 个项目对其进行分页,出于性能原因,我不想使用 offset,而只是使用 limit:

select id, createdAt from post order by createdAt desc, id desc limit 2

enter image description here

要获取接下来的 2 个项目,我使用此查询:

SELECT id, createdAt FROM post  WHERE createdAt <= '2014-11-16 09:11:03' AND (id < '15' OR createdAt < '2014-11-16 09:11:03') ORDER BY createdAt DESC, id DESC LIMIT 2

enter image description here

我可以这样继续下去。获取最后一个项目的 createdAtid,然后将其用于下一页 查询。

但是我花了近两天的时间来尝试制定上一页查询,但还没有找到方法。

这是我已经尝试过的:

从当前结果中获取第一个项目(而不是最后一个),使用它的 idcreatedAt 字段并反转查询中的条件 (createdAt >=, id >,创建于 >)。但这个查询总是给我前两个结果(这是正常的,因为提供此条件的行是前两个)。

我已经没有主意了。我需要帮助。谢谢。

最佳答案

您可以按升序排列以获得正确的记录:

SELECT id, createdAt 
  FROM post 
 WHERE createdAt >= '2014-11-16 09:11:03' 
   AND (id > '15' OR createdAt > '2014-11-16 09:11:03') ORDER BY createdAt ASC, id ASC
LIMIT 2

显示结果集时进行相反的排序。

关于Mysql无偏移分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26956943/

相关文章:

mysql - 使用 JDBC for MySQl 设置锁定超时

sql - 加入动态列名称

css - cakephp中的分页设计

mysql - 隐藏 vb6 中的连接字符串并保护 mysql 密码

mysql双引号表名

mysql - MySQL : Errorno 150 是什么原因

android - 如何将分页请求发送到firebase以实现无限滚动的recyclerview

mysql - SQL Server 2012 等效限制分页

MYSQL嵌套循环存储过程问题

mysql - 将此 PostgreSQL 代码转换为 MySQL 的正确方法是什么