- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
对于大型数据集,offset
基于游标的分页变得很慢,因此更快的方法是使用基于游标的分页。基本上,一个 anchor ,数据库知道从该点开始查找结果。考虑到这一点,这是我面临的问题:
我有一张 table tv_watchers
自动递增 id
, mins_watching_tv
, 和 user_id
(下面总共 20 行 fiddle )。在这个例子中 user_id
会是一样的1
,所以不用担心。我们想按看电视的分钟数从高到低排序。
这很容易使用这个查询来完成:
SELECT * FROM tv_watchers
ORDER BY mins_watching_tv DESC, id ASC
这将返回按 id 以这种方式排序的 20 个字段的正确顺序:
2, 17, 1, 16, 15, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20, 3, 4, 14, 19, 18
问题是我们想把它分成 5 个 block (我们称之为批处理),因为我们想按上面的顺序返回 5 个结果。我们通过检索前 6 个结果,将前 5 个结果返回给用户,并使用第 6 个(如果存在)作为光标( anchor )从以下位置获取下一批来执行此操作:这将正确返回第一批:
-- (Batch 1) 2, 17, 1, 16, 15, 5
SELECT * FROM tv_watchers
ORDER BY mins_watching_tv DESC, id ASC
LIMIT 6
这里的第 6 项是 id 5
它有一个 mins_watching_tv
的 60
, 所以因为这是我们使用它来获取下一个 6 这样的光标:
-- (Batch 2) 5, 6, 7, 8, 9, 10
SELECT * FROM tv_watchers
WHERE mins_watching_tv <= 60 OR id=5
ORDER BY mins_watching_tv DESC, id ASC
LIMIT 6
这里的第 6 项是 id 10
其中还有一个 mins_watching_tv
的 60
, 所以因为这是我们使用它来获取下一个 6 这样的光标:
-- (Batch 3 should be) 10, 11, 12, 13, 20, 3
-- (Batch 3 returns incorrectly) 5, 6, 7, 8, 9, 10
SELECT * FROM tv_watchers
WHERE mins_watching_tv <= 60 OR id=10
ORDER BY mins_watching_tv DESC, id ASC
LIMIT 6
但问题是返回的结果不正确,它返回上面评论中看到的不正确的批处理 3 ID。我确定它与 WHERE
有关部分,它似乎拿起了 mins_watching_tv <= 60
部分但id=10
部分是为了让数据库知道从 60 分钟和 id 10 的 anchor 获取结果,但这不能正常工作。
最终的批处理结果应该是这样的:
-- (Batch 4) 3, 4, 14, 19, 18
我设置了一个 sql fiddle here显示问题。我们如何修复查询,使其符合 mins_watching_tv
的游标组合结合 id
批量返回正确结果?
最佳答案
像之前一样选择前 6 个,不在 WHERE
中选择任何内容.
SELECT *
FROM tv_watchers
ORDER BY mins_watching_tv DESC,
id ASC
LIMIT 6;
持续时间 @duration
和 ID @id
将上一步结果的最后一行放入 WHERE
中喜欢
SELECT *
FROM tv_watchers
WHERE mins_watching_tv < @duration
OR mins_watching_tv = @duration
AND id >= @id
ORDER BY mins_watching_tv DESC,
id ASC
LIMIT 6;
重复 2. 直到结束。
解释:
mins_watching_tv < @duration
我们可以确定,相应的行不在我们之前的结果中 mins_watching_tv
小于最小值 @duration
根据我们之前的结果,我们做了一个 ORDER BY mins_watching_tv DESC
.mins_watching_tv = @duration
我们还不知道我们是否已经有了这一行。但是当我们另外做了一个 ORDER BY id ASC
,我们知道我们已经拥有相同的所有行 mins_watching_tv
有一个小于或等于当前最大值的 id @id
(根据 mins_watching_tv
)。所以我们只想要那些行 id > @id
或者,因为我们还希望重复上一个结果的最后一行,id = @id
.简而言之就是 id >= @id
.因为我们想要这两个集合的并集,我们必须分离上面的谓词,所以使用 OR
.我们得到(括号只是为了清楚起见,不需要它们):
(mins_watching_tv < @duration)
OR (mins_watching_tv = @duration
AND id >= @id)
和here是 fiddle 。
关于mysql - 没有偏移量的基于游标的分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50335720/
我正在尝试使用游标遍历表: DEClARE @ProjectOID as nvarchar (100) DECLARE @TaskOID as nvarchar (100) DECLARE TaskO
使用 JOprionPane 时,光标出现了一些问题。我将光标设置到 pharent 框架,然后使用这个显示一个对话框: Object[] possibilities = {"ham", "spam"
我想将数据从一个表(原始数据,所有列都是 VARCHAR)复制到另一个表(使用相应的列格式进行格式化)。 为了将数据从 rawdata 表复制到 formatted 表中,我使用游标来识别受影响的行。
我先走了 我 100% 属于集合运算阵营。但是当设置逻辑时会发生什么在整个所需的输入域上进行检索会导致如此大的检索,以至于查询显着减慢,变得缓慢,或者基本上需要无限的时间? 在这种情况下,我将使用可能
为什么我不能这样做?我想从 TABLEA 中搜索大于光标值的最接近的值,对两者执行平均函数并将结果放入 test3 中。我收到错误代码 1054 未知列“Xnearest in 'field list
我希望以下存储例程返回一系列行,但它只返回 1: CREATE PROCEDURE example() BEGIN DECLARE current_id INT;
我有一张代表患者体检的表,它有检查 ID 和患者 ID。 我想逐行浏览表格并获取每个患者 ID 并比较其不同的咨询,看看它是否被视为“new_attack”。我正在处理疟疾疾病,我们认为每个在过去 6
如文档所述here ,我需要声明一个在打开时接受参数的游标。 我的查询类似于: DECLARE cur CURSOR (argName character varying) FOR SELECT *
我正在尝试使用 PostgreSQL 学习基本游标。这是我的脚本: DECLARE cur_employees CURSOR FOR SELECT * FROM employee CLOS
*DELIMITER // create procedure test(OUT l_out INT) begin DECLARE done INT DEFAULT FALSE; declare l_s
来自 psycopg2 文档: When a database query is executed, the Psycopg cursor usually fetches all the record
我正在使用 while 循环遍历游标,然后输出数据库中每个点的经度和纬度值。 出于某种原因,它没有返回光标中的最后一组(或第一个取决于我是否使用 Cursor.MoveToLast)经度和纬度值。 这
不知道有没有人试过全新的PHPStorm 4 , 但我遇到了这个新版本的问题,而我以前的主要版本 (PHPStorm 3) 没有。 基本上,当我单击代码 View 空白处的任意位置时,光标会设置在该位
mysql的存储过程、游标 、事务实例详解 下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考。 其中,涉及到了存储过程、游标(双层循环)、事务。 【说明】:代码
Mysql的存储过程是从版本5才开始支持的,所以目前一般使用的都可以用到存储过程。今天分享下自己对于Mysql存储过程的认识与了解。 一些简单的调用以及语法规则这里就不在赘述,网上有许多例子。这里
我正在使用 SQL Server,我有一个包含 3 列(时间序列)的表 data ,带日期,hour开始,AwardStatus . 大部分奖励状态是随机生成的。有两种选择,授予或未授予。 但是,业务
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
Why am getting duplicate records ? pls correct me.Thanks in Advance. declare clazzes_rec clazzes%r
Why am getting duplicate records ? pls correct me.Thanks in Advance. declare clazzes_rec clazzes%r
我需要在数据表中设置一个非唯一标识符。这在组内是连续的,即。对于每个组,ID 应从 1 开始,并以 1 为增量递增,直到该组的最后一行。 下表对此进行了说明。 “新 ID”是我需要填充的列。 Uniq
我是一名优秀的程序员,十分优秀!