MySQL 基于游标的多列分页

2024-02-12

我有一些表想要使用基于游标的分页进行查询,但它需要应用于多个列。

让我们举一个使用 2 列的简化示例 - 我像这样获取第一页:

SELECT column_1, column_2
FROM table_name
ORDER BY column_1, column_2
LIMIT 10

获得结果后,我可以根据最后一行获取下一页。假设最后一行是column_1 = 5, column_2 = 8。我想做这样的事情:

SELECT column_1, column_2
FROM table_name
WHERE column_1 > 5 AND column_2 > 8
ORDER BY column_1, column_2
LIMIT 10

但这显然是错误的。它会过滤掉具有以下内容的行column_1 = 5, column_2 = 9(因为过滤器打开了column_1)或具有column_1 = 6, column_2 = 6(因为过滤器打开了column_2)

我可以这样做来避免这个问题:

SELECT column_1, column_2
FROM table_name
WHERE column_1 > 5
OR (column_1 = 5 AND column_2 > 8)
ORDER BY column_1, column_2
LIMIT 10

但这对于超过 2 列来说变得非常麻烦并且容易出错......

另外,我的用例包括多种类型的列(INT UNSIGNED and BINARY),但都是可比较的

你有什么建议吗?

Thanks!


如果列Column_1是独一无二的,我们可以这样做:

 WHERE Column_1 > :last_retrieved_value
 ORDER BY Column_1
 LIMIT 20

从问题看来,Column_1并不是唯一的,但是(Column_1,Column_2)元组是唯一的。

“下一页”查询的一般形式,按这两列排序,使用这两列的最后检索到的值,将是......

    (Column1,Column2) > (:lrv_col1,:lrv_col2)

(lrv = 从上一个查询检索到的最后一行保存的值)

要在 MySQL 中写入该条件,我们可以像您所示的那样执行此操作:

 WHERE t.Column_1 > :lrv_col1
    OR ( t.Column_1 = :lrv_col1 AND t.Column_2 > :lrv_col2 )

或者,我们可以这样写,我更喜欢这样,因为 MySQL 被 OR 条件混淆并使用错误索引的机会要小得多......

 WHERE t.Column_1 >= :lrv_col1
       AND ( t.Column_1 > :lrv_col1 OR t.Column_2 > :lrv_col2 )
 ORDER BY t.Column_1, t.Column_2
 LIMIT n

将其扩展到three列,检查条件...

  (c1,c2,c3) > (:lrv1,:lrv2,:lrv3)

我们处理它就像处理两列一样,处理c1首先,像两列一样将其分解:

 WHERE c1 >= :lrv1
       AND ( c1 > :lrv1 OR ( ... ) )
 ORDER BY c1, c2, c3
 LIMIT n

现在那个占位符...(哪里会只检查c2之前,实际上又只是两列的另一种情况。我们需要检查:(c2,c3) > (lrv2,lrv3),所以我们可以使用相同的模式扩展它:

 WHERE c1 >= :lrv1
       AND ( c1 > :lrv1 OR ( c2 >= :lrv2 
                             AND ( c2 > :lrv2 OR c3 > :lrv3 )
                           )
           )
 ORDER BY c1,c2,c3
 LIMIT n

我同意扩展可能看起来有点混乱。但它确实遵循一个非常有规律的模式。类似地,我们可以将条件表达为four列...

 (c1,c2,c3,c4) > (:lrv1,:lrv2,:lrv3,:lrv4)

我们只需要三列,然后我们需要扩展c3 > :lrv3替换为( c3 >= :lrv3 AND ( c3 > :lrv3 OR c4 > :lrv4 ) )

 WHERE c1 >= :lrv1
       AND ( c1 > :lrv1 OR ( c2 >= :lrv2 
                             AND ( c2 > :lrv2 OR ( c3 >= :lrv3
                                                   AND ( c3 > :lrv3 OR c4 > :lrv4 )
                                                 )
                                 )
                           )
           )
 ORDER BY c1,c2,c3,c4
 LIMIT n

为了帮助未来的读者,我会评论这个块,并表明意图......

 -- (c1,c2,c3,c4) > (lr1,lr2,lr3,lr4)

如果 MySQL 允许我们像这样表达比较,那就太好了。不幸的是,我们必须将其扩展为 MySQL 可以理解的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 基于游标的多列分页 的相关文章

  • iPhone UITableView 分页结果

    对从服务器拉取的大量结果进行分页的最佳方法是什么 就服务器而言 我可以抵消和限制结果 因此我一次只能提取 25 个结果 但是允许用户查看更多结果而不需要像应用商店一样不断向下滚动不断增长的列表的最佳方式是什么应用程序 谢谢 豪伊 要在列表底
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 在 MacOSX10.6 上运行 python 服务器时 MySQLdb 错误

    运行我的服务器 python manage py runserver 产生以下错误 django core exceptions ImproperlyConfigured 加载 MySQLdb 模块时出错 没有名为 MySQLdb 的模块
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式

    我正在使用 MySQL 的 LOAD DATA LOCAL INFILE SQL 语句将数据从 CSV 文件加载到现有数据库表中 下面是一个 SQL 语句示例 LOAD DATA LOCAL INFILE file csv INTO TAB
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 如何在Mysql中仅将不同的值从一个表复制到另一个表?

    我有一个大约 2 5GB 的 MySql 数据库 表 A 具有以下列 anoid query date item rank url 我刚刚创建了另一个仅包含列的表 b query and date 我想在查询列中插入所有不同的记录 及其各自
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 如何使用 vitess 仅对特定表进行分片

    我创建了一个包含三个表的未分片键空间 现在我想对前两个表的键空间进行分片 但不想对第三个表进行分片 如何才能做到这一点 Vitess 文档不包含任何与此相关的信息或示例 请帮忙 Thanks vitess 中的垂直分片与水平分片类似 您应该
  • 比特纳米。重置mysql根密码

    我如何重置 MySQL 中的 root 密码和帐户 因为我按照如何为其他服务器授予权限的说明操作 并且意外地将 root 用户 Mysql 绑定到其他 IP 地址 现在看来我无法在 localhost 上以管理员身份登录 Thanks 您有
  • Oracle查询结果分页无TABLE FULL SCAN数据访问方式

    stackoverflow 上有很多关于如何正确执行分页的问题 对于 Oracle 来说 最流行的答案是这样的 select from select row rownum rownum from select from some table
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 如何从shell脚本自动登录MySQL?

    我有一个 MySQL 服务器 其中有一个用户和密码 我想在 shell 脚本中执行一些 SQL 查询而不指定密码 如下所示 config sh MYSQL ROOT root MYSQL PASS password mysql sh sou
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • 如何修改现有表以添加时区

    我有一个包含 500 多个表的大型应用程序 我必须将应用程序转换为时区感知 当前应用程序使用new java util Date GETDATE 与服务器的时区 即没有任何时区支持 我已将这项任务分为几个步骤 以便于开发 我确定的第一个步骤

随机推荐

  • 如何在 C# 中使用 TFS Rest API 在现有用户故事下创建子任务?

    我知道有一项规定可以使用 TFS Rest API 在批量调用中创建用户故事和子任务 如中所述https www visualstudio com en us docs integrate api wit samples https www
  • 如何从base64数据字符串javascript保存PNG图像服务器端

    我有这段代码 要么 ajax 没有正确传输数据 要么我的 php 不能正常工作 我知道画布正在保存到它写入页面的数据 png 中 有没有办法将其转换为文件并从 JavaScript 保存 启动 JavaScript var canvas d
  • Camel REST Bean 链接

    我目前有一个 REST 路由构建器 如下所示 rest v1 post create to bean myAssembler method assemble in header content to bean myService metho
  • AngularJS 承诺链

    我的应用程序应该打开一个弹出窗口 要求用户确认 然后进行 ajax cal 并关闭弹出窗口 我尝试使用一链来做到这一点promise 我已经使用过它 我记得它应该以这种方式工作 但它似乎在调用后阻塞reservationService co
  • 使用 RavenDb 查询字典

    我有一个类定义为 public class Student public string Id get set public IDictionary
  • 模拟 javax.mail.Transport

    无需创建另一个我可以注入的类 是否可以嘲笑javax mail Transport所以我可以做一些模拟测试Transport send Java EE 7 上的方法 由于 Dumbster 没有当前可用的 Maven Central 工件
  • ASP.NET MVC3 ajax 部分视图刷新

    我在 asp net mvc3 中面临 ajax 更新 div 的问题 我有一个包含内容的视图 div Html RenderPartial RefreshComments Model div div using Ajax BeginFor
  • 如何编译将以管理员身份启动 exe 的程序[重复]

    这个问题在这里已经有答案了 可能的重复 以编程方式提升进程权限 https stackoverflow com questions 133379 elevating process privilege programatically 我想在
  • Spring 3.1 - 未找到 javascript 文件 - 404 错误

    我在文件夹 WebContent resources js test js 中有一个 js 文件 我试图在 jsp 中包含相同的文件 但是jsp文件无法找到js文件 浏览器控制台出现404错误 我已经提出了几个问题 SpringMVC 可以
  • 在哪里可以管理上传到 Gitlab.com 项目 wiki 的文件?

    在为我的私人项目创建 wiki 时 我已将一些文件上传到 gitlab com 上的 Gitlab 存储库 现在我的问题是 我可以查看已上传文件的列表吗 有什么办法可以删除其中一些吗 为什么上传文件的权限是公开的 可以改成私密吗 gitla
  • 如何从 iPhone 上的在线网址播放音频 [重复]

    这个问题在这里已经有答案了 我知道以前有很多人问过这个问题 但我只是不知道为什么这在我的 x code 和 Objective C 应用程序中不起作用 基本上 我想从 url 在应用程序中播放音频 仅使用Apple网站上的测试音频 我的代码
  • 空文件上的 AWK FNR==NR

    我正在运行以下命令 只要它们的内容在第一个文件中 该命令就可以很好地工作 awk F FNR NR a tolower 1 next a tolower 1 OutSideSyncUsers csv NewUsers csv 如果第一个文件
  • 将 ID 添加到 Google 地图标记,然后定位它[重复]

    这个问题在这里已经有答案了 我已经使用 Google Maps API v3 创建了一个 google 地图 并添加了一个自定义标记 我已经向标记构造函数添加了一个 ID 我希望使用 jQuery 以其他 JS 为目标 但目前 当我只是尝试
  • 静态链接到动态库。 glibc

    所以 我遇到一个问题 一台机器上有两个版本的 GCC 3 4 6和4 1 这是由于新软件的一些依赖性问题 需要 glibc 4 1 当我将这个新软件与 4 1 库链接时 它链接得很好 但是 当执行软件时 它找不到该库 因为它正在我的 LD
  • ExtJs 面板 - 添加动态组件

    我有一扇窗户 窗户内有面板 我动态地将组件添加到面板中 这些组件采用 hbox 布局 以便水平排列 单击按钮后 我将在 hbox 布局中向面板中添加一行类似的组件 这里的问题是我想在第一行下方添加第二行 但以下代码将组件添加到面板的顶部 p
  • Symfony2 Doctrine 查询生成器作为 FROM 子句中的子查询

    我使用查询生成器得到了一个查询 并将其分配给 qb多变的 它在 PHP 和数据库中都可以正常工作 现在 我尝试将该查询用作子查询 如下所示 subQuery qb gt getQuery gt getSql query select res
  • 如何调试 Linux 内核模块的 init_module() 调用?

    我正在迈出 Linux 内核开发的第一步 我有一些代码生成 ko我安装的内核模块insmod 我想要一种方法来调试安装模块时发生的情况 但我遇到了一些困难 我需要调试调用init module 当我运行时这个函数被调用吗insmode 我尝
  • UPI Deep Link 付款被拒绝

    我不知道在哪里问这个问题是否合适 而是我不知道在哪里问这个问题 我正在flutter中开发一个应用程序 对于应用程序内购买我正在尝试实现UPI支付 我也有一些插件可以做到这一点 但是当我测试时 我的交易被拒绝 我正在尝试通过应用程序中的 P
  • 具有多个模板参数的 C++ 概念

    Bjarne Stroustrup 最近发表了report http www stroustrup com good concepts pdf在 C 概念 中 他提到了一些让我感到惊讶的事情 该示例 第 7 1 节中 使用 速记模板表示法
  • MySQL 基于游标的多列分页

    我有一些表想要使用基于游标的分页进行查询 但它需要应用于多个列 让我们举一个使用 2 列的简化示例 我像这样获取第一页 SELECT column 1 column 2 FROM table name ORDER BY column 1 c