【发布时间】:2015-04-07 03:02:01
【问题描述】:
我有一个网络应用程序,我在其中显示了基于此表架构的一系列帖子(有数千行这样的行和其他列也有(因为这个问题不需要删除)):-
+---------+----------+----------+
| ID | COL1 | COL2 |
+---------+----------+----------+
| 1 | NULL | ---- |
| 2 | --- | NULL |
| 3 | NULL | ---- |
| 4 | --- | NULL |
| 5 | NULL | NULL |
| 6 | --- | NULL |
| 7 | NULL | ---- |
| 8 | --- | NULL |
+---------+----------+----------+
我使用这个查询:-
SELECT * from `TABLE` WHERE `COL1` IS NOT NULL AND `COL2` IS NULL ORDER BY `COL1`;
我得到的结果集是这样的:-
+---------+----------+----------+
| ID | COL1 | COL2 |
+---------+----------+----------+
| 12 | --- | NULL |
| 1 | --- | NULL |
| 6 | --- | NULL |
| 8 | --- | NULL |
| 11 | --- | NULL |
| 13 | --- | NULL |
| 5 | --- | NULL |
| 9 | --- | NULL |
| 17 | --- | NULL |
| 21 | --- | NULL |
| 23 | --- | NULL |
| 4 | --- | NULL |
| 32 | --- | NULL |
| 58 | --- | NULL |
| 61 | --- | NULL |
| 43 | --- | NULL |
+---------+----------+----------+
请注意,由于 order by 子句,IDs 列是混乱的。
我有适当的索引来优化这些查询。
现在,让我解释一下真正的问题。我的网络应用程序中有一种延迟加载功能。因此,我在第一页查询后使用LIMIT 10 每页显示大约 10 个帖子。
到目前为止,我们都很好。但是,真正的问题出现在我必须加载第二页时。我现在要查询什么?我不希望帖子被重复。几乎每 15 秒就会有新帖子出现,这使它们位于结果集的顶部(我的字面意思是第一行)(我不想在第二页或第三页显示这些最新帖子,但它们会改变结果集大小,所以我不能在第二页使用LIMIT 10,10,以此类推,因为帖子将被重复。)。
现在,我只知道我显示的帖子的最后一个 ID。在这里说21。所以,我想显示 ID 为 23,4,32,58,61,43 的帖子(请参阅上面的结果集表)。现在,我是否在不使用 LIMIT 子句的情况下加载所有行并显示出现在 id 21 之后的 10 个 id。但为此,我将不得不对数千个无用的行进行交互。但是,我不能在第 2、3... 页使用 LIMIT 子句,这是肯定的。另外,ID很乱,所以我绝对不能使用WHERE ID>...。那么,我们现在要去哪里?
【问题讨论】:
-
既然你的
COL1是可排序的,那么在每个请求中记住COL1的最新记录如何,在下一页加载WHERE COL1>?? -
@Passerby,我已经想到了。但是,
COL1有许多相同的行。实际上,COL1是一个时间戳,许多行可能具有相同的时间戳(在我的结果集中)