但是如上好像只能找出此用户未读的短消息来,我现在想做成可以标记出系统短消息中此用户哪些没看过
select  *  from  CommonMessage  where  messageid  not  in  (select  messageid  from  UserMessage  where  uid=@uid) 哪些看过
select  *  from  CommonMessage  where  messageid  in  (select  messageid  from  UserMessage  where  uid=@uid)并且用户可以自己把不想显示的系统短消息删除(用字段标记一下不显示),那位能有好的建议? 
要实现此功能,上述的数据结构得有变化:
UserMessage表加两列,一个表示此用户是否愿意读此信息(IsVisible),一个表示此用户是否读过该信息(IsRead)这时上述的两个查询得做相应的修改

解决方案 »

  1.   

    如ls所说的  这样做最方便 但是用户很多啊~不过要想做成我说的那样的,如果用户上线率高~并且查看率也很高~那还不如做成ls所说的那样的  反过来 分表标记为好
      

  2.   


    不是已经有记录用户看过哪些的表么?否则又怎可能“ select  *  from  ......”?!对于用户不想显示系统短消息,用户不读它又怎样去知道设置何时设置它?没有什么要修改、设计的,那两个表已经够了。
      

  3.   

    1.现有表结构已经OK//这是未读的
    select  *  from  CommonMessage  where  messageid  not  in  (select  messageid  from  UserMessage  where  uid=@uid) 
    //已经读了
    select  *  from  CommonMessage  where  messageid  in  (select  messageid  from  UserMessage  where  uid=@uid) //未读的消息属于系统的肯定不能删除了,要不然就不能存在系统消息这一说了读过的可以直接删除
    //如下
    delete from usermessage where messageid=@msgid and uid=@uid;2. 如果要删除用户未读的消息,那就得在创建消息的时候给用户消息表创建一条消息记录,并置标志位为未读0,修改消息表增加一个字段,阅读标志
    读完消息就更改阅读标志为1,那上面的Sql语句也得更改
    //未读
    select  *  from  CommonMessage  where  messageid  in  (select  messageid  from  UserMessage  where  uid=@uid and 读标志='0')//已读
    select  *  from  CommonMessage  where  messageid  in  (select  messageid  from  UserMessage  where  uid=@uid and 读标志='1')//删除,不管读不读 删除都是一样的
    delete from usermessage where messageid=@msgid and uid=@uid;
      

  4.   

    嗯,如果用户不想读系统短消息(那么此时用户肯定无法指定具体的短消息,只能笼统的全都不读),那么直接把select出来的用户没有读的短消息插入已经读的消息表中就不会再显示了。
      

  5.   

    又看到了sp1234,hehe...
    其实是这样的,我想做到未读的用粗体显示,已读的正常显示,可以让用户删除(在数据库里就是标记为不显示,不然用户删除了,其他的用户怎么看)***对于用户不想显示系统短消息,用户不读它又怎样去知道设置何时设置它?***
       用户读取了 就会在usermessage表里记录一下,表明读过了,那么我可以作出系统信息用户哪些读取过哪些没读取过,现在是想让用户也可以"删除"读取过的系统消息,那怎么去办?第二 如楼上 Fibona 同学所说
    读过的可以直接删除 
    //如下 
    delete from usermessage where messageid=@msgid and uid=@uid; 如果这样,那么他删除的信息又会重新在未读的系统短消息里面出来了啊
    第二点
    我觉得这样做,让系统分发给每一位用户一条短消息没有什么区别了还是感谢各位作出的解答!静候!!
      

  6.   

    哦,是在UserMessage 中的要删除啊。既然“肯定不用把系统的短消息发给每一个用户”,那么看起来也只能对要删除的额外建一个“不显示”表了。
      

  7.   

    我又想了想Fibona 同学所说的第二种情况,可不可以这样实现2. 如果要删除用户未读的消息,那就得在创建消息的时候给用户消息表创建一条消息记录,并置标志位为未读0, 修改消息表增加一个字段,阅读标志 
    读完消息就更改阅读标志为1, 那上面的Sql语句也得更改 
    //未读 
    select  *  from  CommonMessage  where  messageid  in  (select  messageid  from  UserMessage  where  uid=@uid and 读标志='0') //已读 
    select  *  from  CommonMessage  where  messageid  in  (select  messageid  from  UserMessage  where  uid=@uid and 读标志='1') //删除,不管读不读 删除都是一样的 
    delete from usermessage where messageid=@msgid and uid=@uid; Fibona 同学说在usermessage表里面增加一个标识为阅读标识,我认为应该是是否显示标识
    这样修改一下,在usermessage表里面
    //已读并且要显示
    select  *  from  CommonMessage  where  messageid  in  (select  messageid  from  UserMessage  where  uid=@uid and 显示标志='0') //已读并且不显示
    select  *  from  CommonMessage  where  messageid  in  (select  messageid  from  UserMessage  where  uid=@uid and 显示标志='1') 未读的就是 select  *  from  CommonMessage  where  messageid  not in(select  messageid  from  UserMessage  where  uid=@uid) 然后联合?
      

  8.   

    其实只要
    //已读并且要显示 
    select  *  from  CommonMessage  where  messageid  in  (select  messageid  from  UserMessage  where  uid=@uid and 显示标志='0') 

    未读的就是 select  *  from  CommonMessage  where  messageid  not in(select  messageid  from  UserMessage  where  uid=@uid) 
    联合一下 就可以得到我想要的那样的情况了吧~
    我想要的是一个记录集~