我的桌子是下面的表格
| 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行,以向用户显示行,就像在消息传递应用程序中向上滑动时查看消息一样。
我尝试了以下方法:
根据第一个选定块的最后一条消息的时间进行检索。但这是不可能的,因为可能同时存在两行或更多行,这将导致两次显示同一行。
SELECT * FROM MessageM,其中TIME_RECEIVED
SELECT * FROM MessageM WHERE TIME_RECEIVED
SELECT * FROM MessageM WHERE TIME_RECEIVED
我读了下面提到的答案
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;
如果在连续的选择之间插入新行,则将为下一个选择语句再次获得已经显示的同一行。完全不可能锁定。
自动递增列可以解决该问题,还是可以通过其他方法(例如,添加具有其他约束的新列)来解决该问题或某种形式的分区。
我已经计划使用以下查询
SELECT * FROM message WHERE TIME
获取最后一行的时间,并从检索到的行中获取具有给定时间的所有行的ID。当第二次查询时,请以NOT IN条件输入ID。
还有其他更好的方法吗?自动递增列可以解决此问题,还是可以使用其他任何方法,例如添加具有其他约束或某种形式的分区的新列。
最佳答案
首先,请勿使用时间列进行排序-而是使用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 |呼啦
因此,您阅读了新文章,现在也有更多页面。
关于mysql - 从频繁更新的mysql表中检索数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53409905/