gpt4 book ai didi

sql - 确定记录在哪一页上

转载 作者:行者123 更新时间:2023-12-03 07:32:21 25 4
gpt4 key购买 nike

如何确定某条记录在哪一页上?

假设我使用这样的查询在每页显示5条记录:

SELECT * FROM posts ORDER BY date DESC LIMIT 0,5
SELECT * FROM posts ORDER BY date DESC LIMIT 5,5
SELECT * FROM posts ORDER BY date DESC LIMIT 10,5

样本数据:
id  | name | date
-----------------------------------------------------
1 | a | 2013-11-07 08:19 page 1
2 | b | 2013-12-02 12:32
3 | c | 2013-12-14 14:11
4 | d | 2013-12-21 09:26
5 | e | 2013-12-22 18:52 _________
6 | f | 2014-01-04 11:20 page 2
7 | g | 2014-01-07 21:09
8 | h | 2014-01-08 13:39
9 | i | 2014-01-08 16:41
10 | j | 2014-01-09 07:45 _________
11 | k | 2014-01-14 22:05 page 3
12 | l | 2014-01-21 17:21

有人可以编辑一条记录,比如 id = 7,或插入一条新记录( id = 13)。如何确定该记录在哪一页上?原因是我要显示包含刚被编辑或添加的记录的页面。

好的,我想如果记录被编辑,我只能显示同一页面。但是问题是何时添加记录。列表可以按名称排序,新记录可以放在任何地方:(

有什么办法可以执行类似 SELECT offset WHERE id = 13 ORDER BY date LIMIT 5的查询,该查询返回10吗?

最佳答案

对于本示例,我们假设刚刚添加了条目7(并且名称可能重复)-您要做的第一件事是查找在该条目之前有多少个条目(基于name),因此:

SELECT COUNT(*) 
FROM Posts
WHERE name <= 'g'
AND id < 7

在这里, id用作“tiebreaker”列,以确保稳定的排序。还假设我们也知道 id的值-鉴于可以复制非关键数据,您 需要这种功能。
无论如何,这给了我们这一(6)之前的行数。通过一些整数除法(基于 LIMIT),我们现在可以获得相关信息:
(int) ((6 - 1) / 5) = 1

...尽管这是针对索引为0的页面(即,条目1-5出现在页面“0”上);但是,在这种情况下,它对我们有利。请注意,我们必须从初始计数中减去1,因为第一页为1,而不是0-否则,条目5将出现在第二页而不是第一页。
现在我们有了页面索引,但是我们需要将其转换为入口索引。一些简单的乘法为我们做到了:
(1 * 5) + 1 = 6

(忽略此计数与计数相同-在这种情况下是巧合)。
这为我们提供了页面上第一个条目的索引,即 OFFSET的值。
我们现在可以编写查询:
SELECT id, name, date
FROM Posts
ORDER BY name, id
LIMIT 5 OFFSET 6

(请记住,如果我们假设 id可以重复,则需要 name来保证数据的稳定排序!)。
这是两次数据库访问。令人惊讶的是,SQLite允许 LIMIT / OFFSET值成为SQL子查询的结果(请记住,并非所有RDBMS都允许它们甚至是宿主变量,这意味着只能使用动态SQL进行更改。尽管在至少一种情况下,db有 ROW_NUMBER()来弥补这一点...)。但是,我无法摆脱子查询的重复。
SELECT Posts.id, Posts.name, Posts.date, Pages.pageCount
FROM Posts
CROSS JOIN (SELECT ((COUNT(*) - 1) / 5) + 1 as pageCount
FROM Posts
WHERE name <= 'g'
AND id < 7) Pages
ORDER BY name
LIMIT 5, (SELECT ((COUNT(*) - 1) / 5) * 5 + 1 as entryCount
FROM Posts
WHERE name <= 'g'
AND id < 7);

(和有效的 SQL Fiddle example)。

关于sql - 确定记录在哪一页上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21346082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com