在这篇文章之前,这个问题可能已经被问过很多次了,但我找不到一个合适的答案来完美地满足我的需求。
假设我有两个表:
table-1: table_msg
-------------------------------------------------------
msg_id | msg_subject | create_time
-------------------------------------------------------
1 | welcome to this site | 2015-01-01 10:20:30
-------------------------------------------------------
2 | How to visit this site | 2015-01-05 10:30:00
--------------------------------------------------------
3 | Plz pay your member fee | 2015-03-10 09:00:00
--------------------------------------------------------
4 | Important Notice | 2015-06-01 12:20:00
--------------------------------------------------------
5 | Plz change your password| 2015-06-15 13:24:01
--------------------------------------------------------
table-2: table_user
-------------------------------
user_id | last_login
-------------------------------
1 | 2015-03-01 07:00:00
-------------------------------我几乎一直看到解决方案,因为user_id-1最后一次登录是在msg_id-3之前,所以如果user_id-1登录2015-06-02,他会有02条新消息msg_id-3和msg_id-4。我可以用css加粗这两条消息的主题,将其显示为UNREAD。现在假设登录后user_id-1打开了msg_id-4,但没有打开<代码>D10,所以<代码>D11仍然是<代码>D12。
现在,当同一个用户再次登录2015-06-20,那么在他最后一次登录之后,msg_id-5可以很容易地识别为UNREAD,因为它是在他最后一次登录2015-06-02之后发布的,它可以设置为粗体,但是msg_id-3在他最后一次登录之前发布但仍然没有打开。它也是UNREAD,应该是粗体字体。
如果没有如下所示的单独表格,我如何将msg_id-3标识为UNREAD:
table-3: read_msg
------------------------
id | user_id | msg_id
------------------------
1 | 1 | 1
------------------------
1 | 1 | 2
------------------------
1 | 1 | 4
------------------------table-3对于少数用户来说是很好的,但是如果用户数量是5000,消息总数是10000或更高,那么这个表对于mysql引擎来说将是一个相当大的表,而且它将每天以几何级数的速度增长。
是否有任何机制/技术或算法,使得与上次登录后发布的消息一起,在上次登录之前未打开的消息也可以被识别为UNREAD,而不需要巨大的read_msg表?
发布于 2015-11-24 23:32:43
为什么不向表中添加一个状态为(1 =已读,0=未读)的列(布尔值),它会在打开某个消息时将状态更新为已读。
表3: read_msg
id | user_id | msg_id|read
1|1| 1|0
1|1| 2|1
1|1| 4|0
考虑以下场景:
用户登录后,有7条未读消息。他选择只读1。如果您创建一个查询/算法来使用他上次登录的时间来查看未读消息,它将看到他在消息发布后登录。但他读过吗?不..。
https://stackoverflow.com/questions/33897386
复制相似问题