在一个论坛中,有回复后系统提醒的功能。那么当你在查看系统消息时,停留在查看系统消息这页。在这时,有新的系统消息进来。这时你按了“删除所有系统消息”,按理,新进来的消息虽然已经保存到了数据库中,但是由于没有看过,所以不能删除。显然,使用这类解法是错误的:
delete from table where to_id=XXX
因为这样会把没有看到消息也删除。
请大家提出自己的解法,如何解决这个问题?
...全文
324打赏收藏
寻最优算法~~~~~~~~
在一个论坛中,有回复后系统提醒的功能。那么当你在查看系统消息时,停留在查看系统消息这页。在这时,有新的系统消息进来。这时你按了“删除所有系统消息”,按理,新进来的消息虽然已经保存到了数据库中,但是由于没有看过,所以不能删除。显然,使用这类解法是错误的: delete from table where to_id=XXX 因为这样会把没有看到消息也删除。 请大家提出自己的解法,如何解决这个问题?
要区分新旧消息,解决问题的关键是要得到能够分隔新旧消息的关键点。这个关键点就是用户点击显示消息页面时,显示第一条消息的那一点(系统消息一般是按时间顺序显示的)。
同时,由于数据表中有ID字段,而ID字段又是以时间顺序排列的,新消息的ID总比旧消息的ID要大,所以,我们可以充分利用这个特性,在显示第一条消息时,记下这个ID。算法描述如下:
RESULT=”SELECT * FROM table WHERE to_id=34123 ORDER BY time DESC” //把SQL结果放入变量RESULT
MAXID=-1
WHILE (RESULT) //循环,直到显示完RESULT的内容才结束
IF (MAXID ==-1) MAXID=RESULT[“ID”] //如果MAXID为-1则赋值
…… // 显示部分
MAXID的值可以通过URL、COOKIE或SESSION等方法传递给删除消息的页面,删除消息的SQL描述如下:
DELETE FROM table WHERE to_id=34123 AND id<=MAXID