创建新记录时,Mysql偏移和限制会产生不明确的结果

时间:2018-04-25 12:17:03

标签: mysql sql sequelize.js

我有一个说明提醒的列表,我从DatabasecreatedAt排序,limit = 10offsetSent,最初为0,计算时间为:提取发生时,服务器返回一个参数lastOffset = offsetSent + lengthOfRecordsFound。 现在问题是当我创建一个新记录,并通过发送ajax请求refresh列表时,它返回我最后一条相同的记录,因为新记录被添加到顶部而offset仍然是同样的。

有没有人有办法解决这个问题?

3 个答案:

答案 0 :(得分:1)

我的猜测是createdAt不是唯一的(为什么要这样?)。您需要提供完全确定的排序顺序,否则您使用的任何分页方法都将随机失败。

-- Latest
ORDER BY createdAt DESC, reminderId DESC

-- Oldest
ORDER BY createdAt, reminderId

答案 1 :(得分:0)

如果你可以摆动它,最好避免OFFSET并使用这样的模式。

如果您首先获取最新信息,请将first_row值设置为非常大的数字。然后在您的查询中使用它。

SELECT id, whatever, whatever
  FROM tbl
 WHERE id < ?first_row?
 ORDER BY id
 LIMIT 10

然后,挂起你获取的最后一个ID。下次获取时,将其值用于first_row。

在实际操作中,您可以让每个SELECT操作再获取一行而不是您需要的LIMIT 11,并且只需使用最后一行来获取其id值。然后使用WHERE id <= ?first_row?代替下一个查询的偏移量。如果第11行永远不会出现在您的程序中,那么您就知道自己已经取得了所有内容。

答案 2 :(得分:0)

伙计我通过从服务器fromto发送值来解决我的问题,这些值基本上是我发送的记录的id。我将它们保存在我的网络应用程序状态中。并查询表id < from || id > to。 :)