我有一个包含数千篇文章的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条!!
我无法弄清楚如何解决这个问题,显然是一个简单的问题。
我已经尝试过:
感谢您的时间。
答案 0 :(得分:0)
使用当前文章ID,而不是基于WHERE UNREAD=1 LIMIT ?,3
进行查询。你想要这样的东西:
WHERE UNREAD=1
AND ID > ?
LIMIT 0,3
其中?
是最后读取的ID。这样,状态切换无关紧要,它只会根据id。
这种方法也可以使用时间戳(即使两个相等),这样:
WHERE UNREAD = 1
AND timestamp >= (SELECT TIMESTAMP FROM tbl WHERE ID = ?)
AND ID > ?
答案 1 :(得分:0)
您还可以跟踪会话期间标记的文档数量,并将计数添加到查询的起始索引中。
WHERE UNREAD = 1
LIMIT lastPosition + Flagged, 3