从数据库获取更改标志的文章

时间:2014-02-03 16:06:30

标签: mysql sql

我有一个包含数千篇文章的MySQL数据库。每篇文章都可以标记为READ或UNREAD(位)。在Web界面中,用户可以选择要显示的文章数量以及是否查看所有文章,或仅查看UNREAD文章。在Javascript方面,我存储了一个 limitStart 值,用于为下一个查询安装LIMIT。例如,在第一个电话中,我们得到前三篇文章,我存储limitStart = 3,在下一个电话中,我要求从3开始。

用户可以随时将文章标记为READ,这就是问题所在。如果用户打开了UNREAD过滤器,然后将文章标记为READ并要求更多项目,他将错过一篇文章,因为limitStart不再是3(但是2),因为他实际上将其标记为已读。

想象一下,我们在数据库中有这个文章列表,标记如下:

1 UNREAD
2 阅读 3 UNREAD
4 阅读 5 UNREAD
6 UNREAD
7 UNREAD
8 UNREAD
9 UNREAD

在第一次使用UNREAD过滤器的调用中,用户获取文章1,3,5(SELECT * WHERE UNREAD=1 LIMIT 0,3)。

现在他将第3条标记为READ并要求提供更多内容:SELECT * WHERE UNREAD=1 LIMIT 3,3

1 UNREAD
2 阅读 3 *阅读
4 阅读 5 UNREAD
6 UNREAD
7 UNREAD
8 UNREAD
9 UNREAD

他得到文章:7,8,9。他错过了第6条!!

我无法弄清楚如何解决这个问题,显然是一个简单的问题。

我已经尝试过:

  • 减少计数器:没办法,因为我有更多状态的标志(如赞成。),所有这些行为都会发生。
  • 使用时间戳并从该时间戳开始:失败,因为项目可以具有相同的时间戳。

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

使用当前文章ID,而不是基于WHERE UNREAD=1 LIMIT ?,3进行查询。你想要这样的东西:

WHERE UNREAD=1
AND ID > ?
LIMIT 0,3

其中?是最后读取的ID。这样,状态切换无关紧要,它只会根据id。

给出接下来的3篇文章

这种方法也可以使用时间戳(即使两个相等),这样:

WHERE UNREAD = 1
AND timestamp >= (SELECT TIMESTAMP FROM tbl WHERE ID = ?)
AND ID > ?

答案 1 :(得分:0)

您还可以跟踪会话期间标记的文档数量,并将计数添加到查询的起始索引中。

WHERE UNREAD = 1 LIMIT lastPosition + Flagged, 3