寻最优算法~~~~~~~~

Magicd 2003-08-19 10:04:39
在一个论坛中,有回复后系统提醒的功能。那么当你在查看系统消息时,停留在查看系统消息这页。在这时,有新的系统消息进来。这时你按了“删除所有系统消息”,按理,新进来的消息虽然已经保存到了数据库中,但是由于没有看过,所以不能删除。显然,使用这类解法是错误的:
delete from table where to_id=XXX
  因为这样会把没有看到消息也删除。
  请大家提出自己的解法,如何解决这个问题?

...全文
29 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sports98 2003-08-19
  • 打赏
  • 举报
回复
同意楼上的

删除的时候仅仅是删除当前的短信息页面所取得的最大ID

select msg,max(id) as mxid from talbe

delete from table where id<=mxid

就是说,最新增加进来的短信息,虽然ID是最大的,但并不是被阅读的短信息页面中取出的最大的,将不会被删除....

bushido 2003-08-19
  • 打赏
  • 举报
回复
刚打开查看系统消息页面时,你可以得到短消息的最大id号或是日期型的或是整型的

然后按删除
delete from table where to_id=XXX and 短消息id<打开页面得到的最大id号
bluemeteor 2003-08-19
  • 打赏
  • 举报
回复
楼主要区别处 “删除所有系统消息”和“删除所有已读消息”的区别

删除所有消息的话那么就算新来的没有看也要删掉,删除已读消息则只是删掉所有已经阅读过的消息

所以你的库表要增加个read字段来判断是否已经读取过:)
LanderCruiser 2003-08-19
  • 打赏
  • 举报
回复
要区分新旧消息,解决问题的关键是要得到能够分隔新旧消息的关键点。这个关键点就是用户点击显示消息页面时,显示第一条消息的那一点(系统消息一般是按时间顺序显示的)。
  同时,由于数据表中有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

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧