群组的公告信息,如何标注已读、未读?

zjroland 2015-04-21 09:09:46
我有一个群组,里面有一个公告信息表:
Groups_Events

里面包括:EventID, GroupID, EventContent等等。

群组里每一个成员登录后,就会自动收到公告信息,已经读过的就标注为:“已读”,未读过的标注为“未读”。问题是,这是针对具体某个成员的,所以不可能在Groups_Events中设计一个字段IsRead,也不想专门设立一个表来记录每一个成员是否读过,而是想在用户User表中,设置一个未读公告的字段 UnreadMsg,

Groups_Users

UserID, UserName, UnreadMsg

这个UnreadMsg中存储未读的EventID,比如 1,2,3,5,7,8,然后用 select EventID from Groups_Users WHERE EventID in UnreadMsg,请问这样可行吗?如何实现?
...全文
1334 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
你YY个呸 2017-01-06
  • 打赏
  • 举报
回复
插入一条系统信息,这种表就不行了,总不能每插入一条系统消息就把所有的用户都插入一遍吧
还在加载中灬 2015-04-21
  • 打赏
  • 举报
回复
补充表前缀~~ --查找某人是否读过某公告 SELECT 1 FROM Groups_Events T1 JOIN ReadEvent T2 ON T1.EventID=T2.EventID WHERE T1.EventID=@EventID AND T2.userid=@userid --有值就是读过,没值就是没读过
还在加载中灬 2015-04-21
  • 打赏
  • 举报
回复
--查找某人是否读过某公告
SELECT 1
FROM Groups_Events T1
	JOIN ReadEvent T2 ON T1.EventID=T2.EventID
WHERE EventID=@EventID AND userid=@userid
--有值就是读过,没值就是没读过
zjroland 2015-04-21
  • 打赏
  • 举报
回复
想要找出‘未读的信息’,是不是 Select * from Groups_Events WHERE (select * from ReadEvent WHERE userid=@userid) is Null
zjroland 2015-04-21
  • 打赏
  • 举报
回复
如果按照3楼的写法,设立一个表 ReadEvent, 包括字段:EventID, UserID,如果在查找信息是判断呢,是这样写???】 Select * from Groups_Events WHERE (select * from ReadEvent WHERE userid=@userid) is Null , 是不是这样写?
还在加载中灬 2015-04-21
  • 打赏
  • 举报
回复
比拼接字符串的要好多了,而且那个拼接字符串的用不了IN,要用LIKE之类,效率更低 还有这上表结构,你要根据你的需要进行调整,如果不需要太多的字段,直接参照我#2楼的那样即可
zjroland 2015-04-21
  • 打赏
  • 举报
回复
明白了,只要高效就行,就怕用户多了,信息多了,查询起来会很慢。。。。。
zjroland 2015-04-21
  • 打赏
  • 举报
回复
好像是这样查询的 SELECT messages.* FROM messages LEFT JOIN messages_read_status ON ( messages.id = messages_read_status.message_id AND messages_read_status.`user_id` = $user_id ) WHERE {OTHER FILTERS} AND ((messages_read_status.`id` IS NULL AND messages.type='public') OR messages_read_status.`status` = 'unread')
还在加载中灬 2015-04-21
  • 打赏
  • 举报
回复
怎么个不高效法,判断一个人有没有阅读,这个查询是很快的,关联一下就出来了
zjroland 2015-04-21
  • 打赏
  • 举报
回复
我看见有人是这样处理的, messages +---------------+---------------------------+ | Field | Type | +---------------+---------------------------+ | id | int(10) unsigned | | admin_id | int(10) unsigned | | type | enum('public','targeted') | | subject | text | +---------------+---------------------------+ messages_read_status +----------------+---------------------------------+ | Field | Type | +----------------+---------------------------------+ | id | int(10) unsigned | | message_id | int(10) unsigned | | user_id | int(10) unsigned | | status | enum('unread','read') | 好像不够高效。
zjroland 2015-04-21
  • 打赏
  • 举报
回复
哦,还是要另外建立一个表啊?
还在加载中灬 2015-04-21
  • 打赏
  • 举报
回复
首先那个语句不可行 然后,这样的表设计也不可取 你应该建一个表,用于记录每个用户已读公告的关系,可以只有两个字段,EventID,UserID,有在这个表的表示已读没有的表示未读,这样确认是否有读只需要关联查询一下就知道了
life923 2015-04-21
  • 打赏
  • 举报
回复
还是新建个表来记录比较适合吧

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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