我的桌子是下面的表格


  | 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/

10-11 01:35