+---------+----------+----------+ | 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显示每页大约10个帖子.
我们在这里很好.但是,当我必须加载第二页时,真正的问题就来了.我现在要查询什么?我不想重复这些帖子.几乎每15秒就有一个新帖子出现,这使得它们在结果集中排在最前面(通过顶部我的字面意思是第一行)(我不想在第二或第三页显示这些最新帖子,但它们会改变结果集大小,所以我不能使用LIMIT 10,10作为第二页,以此类推,因为帖子将重复.).
现在,我所知道的是我显示的帖子的最后一个ID.在这说21.所以,我想显示ID 23,4,32,58,61,43的帖子(参考上面的结果集表).现在,我是否在不使用LIMIT子句的情况下加载所有行,并显示在id 21之后出现的10个ID.但为此我将需要对数千个无用的行进行交互.但是,我不能使用LIMIT子句进行第2次,第3次……这是肯定的.此外,ID是混乱的,所以我绝对不能使用WHERE ID> ….那么,我们现在去哪里?
我想了一会儿,想出了两个解决方案. : –
>存储已显示的帖子的ID并查询WHERE ID NOT IN(id1,id2,…).但是,这将花费你额外的记忆.如果用户加载100页并且id为100000s,那么单个GET请求将无法处理它.至少在所有浏览器中都没有.可以使用POST请求.>改变您从COL1显示帖子的方式.我不知道这对你来说是不是一个好方法.但是,它可以为您节省带宽并使您的代码更清晰.这也可能是一种更好的方式.我建议这样: – SELECT * from TABLE其中COL1不为NULL且COL2为NULL且Id> .. ORDER BY ID DESC LIMIT 10,10.这可能会影响您突然显示帖子的方式.但是,正如您在评论中所说,检查帖子是否符合条件并将COL1从NULL更改为当前时间戳时,我想发布的帖子越新,您想要显示的就越多.这只是一个想法.