【发布时间】:2014-02-16 05:43:46
【问题描述】:
如何确定某条记录在哪个页面上?
假设我使用这样的查询在每页显示 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 的查询吗?
【问题讨论】:
-
date记录了什么?这是一个列的可怕名称 - 它仅描述类型,而不是重要的 - 包含的信息。例如,如果它真的是updatedAt,我会假设页面会page 1....(除非更新频率太快,在这种情况下无论如何你都会遇到分页问题)。否则,您必须对所有页面进行排序(基于任何内容),分配排名(在页面中放置),然后找到给定条目的排名(以及页面)。如果您的条目集很大,这可能会很昂贵...... OLAP 函数/CTE 有帮助,但是...... -
它是
createdAt,而不是updatedAt。如果我必须得到整套,我不明白排名有什么帮助:s -
我说的是 OLAP 函数,例如
ROW_NUMBER(),这就是所谓的“窗口函数”(不过,SQLite 似乎没有这个特性)。该函数根据指定的顺序分配一个递增的数字,然后可以使用它返回偏移量和东西。虽然,考虑到这一点,这里还有另一种可能的解决方案......写答案......
标签: sql sqlite select pagination offset