我有一个网络应用程序,我在其中显示基于此表模式的一系列帖子(有这样的数千行和其他列也被删除(这个问题不需要删除)): -
+---------+----------+----------+
| ID | COL1 | COL2 |
+---------+----------+----------+
| 1 | NULL | ---- |
| 2 | --- | NULL |
| 3 | NULL | ---- |
| 4 | --- | NULL |
| 5 | NULL | NULL |
| 6 | --- | NULL |
| 7 | NULL | ---- |
| 8 | --- | NULL |
+---------+----------+----------+
Run Code Online (Sandbox Code Playgroud)
我使用这个查询: -
SELECT * from `TABLE` WHERE `COL1` IS NOT NULL AND `COL2` IS NULL ORDER BY `COL1`;
Run Code Online (Sandbox Code Playgroud)
我得到的结果集如下: -
+---------+----------+----------+
| 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 |
+---------+----------+----------+
Run Code Online (Sandbox Code Playgroud)
请注意,由于order by子句,ID列是混乱的.
我有适当的索引来优化这些查询.现在,让我解释一下真正的问题.我的网络应用程序中有一种延迟加载的功能.因此,我LIMIT 10在第一页的查询后使用a显示每页大约10个帖子.
我们在这里很好.但是,当我必须加载第二页时,真正的问题就来了.我现在要查询什么?我不想重复这些帖子.并且几乎每15秒就有一个新帖子出现,这使得它们在结果集中排在最前面(通过顶部我的字面意思是第一行)(我不想在第二或第三页显示这些最新帖子,但它们会改变结果集大小所以我不能LIMIT 10,10用于第二页等,因为帖子将重复.).
现在,我所知道的是我显示的帖子的最后一个ID.21在这里说 所以,我想显示ID的帖子23,4,32,58,61,43(参考上面的结果集表).现在,我是否在不使用LIMIT子句的情况下加载所有行,并在id之后显示10个ID 21.但为此,我将不得不对数千个无用的行进行交互.但是,我不能使用LIMIT第2,第3 ......页的子句,这是肯定的.此外,ID是混乱的,所以我绝对不能使用WHERE ID>....那么,我们现在去哪儿了?
嗯..我想了一会儿,想出了两个解决方案。:-
存储已显示和查询的帖子的 Id WHERE ID NOT IN(id1,id2,...)。但是,这会花费你额外的内存。如果用户加载 100 个页面并且 id 为 100000,那么单个 GET 请求将无法处理它。至少不是在所有浏览器中。可以使用 POST 请求。
改变您显示来自 的帖子的方式COL1。我不知道这对你来说是否是一个好方法。但是,它可以节省您的带宽并使您的代码更干净。这或许也是一个更好的方式。我建议这样做:- SELECT * from TABLE where COL1 IS NOT NULL AND COL2 IS NULL AND Id>.. ORDER BY ID DESC LIMIT 10,10。这可能会突飞猛进地影响您显示帖子的方式。但是,正如您在评论中所说,您检查帖子是否符合条件并将 COL1 从 NULL 更改为当前时间戳,我想帖子越新,您想要显示的内容就越多。这只是一个想法。