我的表格的格式如下
| ID | TIME | USER |数据|
| 1 | 1542785267683 | A |嗨
| 2 | 1542785385809 | B |你好|
| 3 | 1542785385809 | C |嘿|
| 4 | 1542785385809 | D | hii
| 5 | 1542785385809 | E |呼啦
| 6 | 1542795485058 | F | hiiiii ||
该表将具有与上面相同的形式,具有1000行。我想从表中检索最新的3行,然后从表中检索接下来的3行,以向用户显示行,就像在消息传递应用程序中向上滑动时查看消息一样。
我尝试了以下方法:
选择*从MessageM中,在TIME_RECEIVED
SELECT *从MessageM,其中TIME_RECEIVED <1542785385809 ORDER BY TIME_RECEIVED DESC LIMIT 3; #留下两行
SELECT * FROM MessageM,其中TIME_RECEIVED <= 1542785385809 ORDER BY TIME_RECEIVED DESC LIMIT 3; #复制两行
MySQL : retrieve a large select by chunks
我的要求几乎相同,除了可以在检索到块之间的时间内更新表。
所以在使用以下查询时
SELECT * FROM Message ORDER BY TIME DESC LIMIT 0,2;
SELECT * FROM Message ORDER BY TIME DESC LIMIT 2,4;
如果在连续的选择之间插入新行,则将为下一个选择语句再次获取已经显示的同一行。完全不可能锁定。
可以自动增加列的值来解决该问题,还是可以使用其他方法(例如,添加具有其他约束的新列)来解决该问题或某种形式的分区。
我已计划使用以下查询
选择*从消息中,WHERE TIME <= 1542785385809并且ID不在(5,4)按时间顺序限制3排序;
获取最后一行的时间,并从检索到的行中获取具有给定时间的所有行的ID。当第二次查询时,请输入NOT IN条件的ID。
还有其他更好的方法吗?自动递增列可以解决此问题,还是可以使用其他任何方法,例如添加具有其他约束或某种形式的分区的新列。
答案 0 :(得分:0)
首先,请勿使用时间列进行排序-而是使用ID
。我想您的ID
列是一个自动递增的整数,因此它是唯一的且插入时间已排序。
其次,让我们考虑一下社交网络(例如LinkedIn)所使用的一种方法:加载供稿(最新的N行)。当您滚动到页面底部时,将加载下一行(另外N行)。当新帖子可用时,您可以按“新帖子”按钮,此按钮将完全重置当前视图并转到开头。这将使您返回第1步,有效地加载最新的N行。
从技术上讲,这是通过以下方式完成的:
SELECT * FROM MessageM ORDER BY ID DESC LIMIT 3;
返回:
| 6 | 1542795485058 | F | hiiiii |
| 5 | 1542785385809 | E |呼啦|
| 4 | 1542785385809 | D | hii |
您还记得ID=4
是最后看到的帖子。对于您加载的下一页:
SELECT * FROM MessageM WHERE ID < 4 ORDER BY ID DESC LIMIT 3;
返回:
| 3 | 1542785385809 | C |嘿|
| 2 | 1542785385809 | B |你好|
| 1 | 1542785267683 | A |嗨|
您还记得ID=1
是最后看到的帖子。对于您加载的下一页:
SELECT * FROM MessageM WHERE ID < 1 ORDER BY ID DESC LIMIT 3;
不返回任何行。这意味着您无法加载任何较早的帖子。
要重置所有内容,只需转到步骤1:
SELECT * FROM MessageM ORDER BY ID DESC LIMIT 3;
返回:
| 7 | 1542785385809 | A |一些新帖子|
| 6 | 1542795485058 | F | hiiiii |
| 5 | 1542785385809 | E |呼啦|
因此,您阅读了新文章,现在还拥有更多页面。