我有一个Web应用程序,其中我根据该表模式显示一系列帖子(也有成千上万的行,例如此行和其他列(此问题不需要删除)):
+---------+----------+----------+
| 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子句,ID列变得混乱。
我有适当的索引来优化这些查询。现在,让我解释一下真正的问题。我的网络应用程序中有一种延迟加载功能。因此,我LIMIT 10
在第一页查询后使用a来显示每页大约10个帖子。
直到这里我们都很好。但是,真正的问题出在我必须加载第二页时。我现在要查询什么?我不希望重复这些帖子。而且几乎每15秒就会出现一则新帖子,使它们排在结果集的顶部(我直指第一行)(我不想在第二或第三页中显示这些最新帖子,但它们会改变结果集大小,因此我无法LIMIT 10,10
用于第二页,以此类推,因为帖子将重复出现。)
现在,我所知道的就是我显示的帖子的最后一个ID。21
在这里说 因此,我想显示ID的帖子23,4,32,58,61,43
(请参阅上面的结果集表)。现在,我是否不使用LIMIT
子句就加载所有行,并显示出现在id之后的10个id 21
。但是为此,我将不得不遍历数千个无用的行。但是,我不能LIMIT
肯定地在第二,第三页...中使用子句。另外,ID混乱,所以我绝对不能使用WHERE ID>...
。那么,我们现在要去哪里?
嗯..我想了一会儿,提出了2个解决方案。:-
存储已经显示并查询的帖子的ID WHERE ID NOT IN(id1,id2,...)
。但是,这将花费您额外的内存。而且,如果用户加载100个页面且ID在100000s以内,则单个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更改为当前时间戳,我想帖子越新,您希望在上面显示的内容越多。这只是一个主意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句