【发布时间】:2019-04-23 21:28:43
【问题描述】:
我的表格如下所示
|身份证 |时间 |用户 |数据|
| 1 | 1542785267683 |一个 |嗨 |
| 2 | 1542785385809 | B |你好|
| 3 | 1542785385809 | C |嘿 |
| 4 | 1542785385809 | D |嗨 |
| 5 | 1542785385809 | E |喂| |
| 6 | 1542795485058 | F | hiiii |
表格的格式与上面相同,有 1000 行。我想从表格中检索最新的 3 行,然后检索接下来的 3 行,以向用户显示这些行,就像在消息应用中向上滑动时查看消息一样。
我尝试了以下方法:
- 根据第一个选定块的最后一条消息的时间进行检索。但这是不可能的,因为两行或多行可能在同一时间,这将导致同一行显示两次。
SELECT * FROM MessageM WHERE 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。
还有其他更好的方法吗?自动递增列是否可以解决问题或任何其他方法,例如添加具有其他约束或某种形式的分区的新列。
【问题讨论】:
-
假设有新记录出现,你想如何处理这种情况?我的意思是,如果你之前没有显示它,会发生什么?
-
如果用户已经获得了最新的 3 行,那么新的记录不应该包含在任何进一步的查询中。否则,新记录将包含在第一次检索中。