在这篇文章之前可能已经多次询问过这个问题,但我找不到合适的答案,这完全符合我的要求。
假设我有两个表:
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
并且未打开msg_id-3
,那么msg_id-3
仍然是UNREAD
。
现在当同一个用户再次登录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
UNREAD
适用于少数用户,但如果用户数量为5000且总消息数为10000或更高,那么表格对于mysql引擎来说将是一个非常大的处理,并且它甚至会在几何上增大白天。
是否存在任何机制/技术或算法,以便与上次登录后发布的消息一起,在上次登录之前未打开的消息也可以标识为read_msg
而没有大的:hover
表?
答案 0 :(得分:0)
为什么不直接在表中添加一个状态(1 =读取,0 =未读)的列(布尔值),在打开某个消息时会更新要读取的状态。
1 | 1 | 4 | 0
考虑以下情况:
用户登录并有7条未读邮件。他选择只读1.如果您创建查询/算法以使用他的上次登录时间来查看未读消息,则会看到他在发布消息后登录。但是他读过吗?不......
答案 1 :(得分:0)
我刚刚注意到,正如您所描述的那样,您有一个包含消息的表。这些消息适合所有人。我认为davejal就像我一样假设这些消息是针对每个用户的。在这种情况下,每个用户每条消息的table_msg中会有一行。要获取该特定用户的消息,该表必须是:
msg_id | msg_subject | create_time | read |user_id|
--------------------------------------------------------------------------
1 | welcome to this site | 2015-01-01 10:20:30| 0 | 1
--------------------------------------------------------------------------
2 | How to visit this site | 2015-01-05 10:30:00| 0 | 1
--------------------------------------------------------------------------
3 | Plz pay your member fee | 2015-03-10 09:00:00| 1 | 1
--------------------------------------------------------------------------
4 | Important Notice | 2015-06-01 12:20:00| 1 | 1
-------------------------------------------------------------------------
5 | Plz change your password| 2015-06-15 13:24:01| 0 | 1
----------------------------------------------------------------------
然后你会做:
select * from table_msg where user_id = 1 and read = 0;
这是我能想到的唯一方法,可以避免使用第三个表
read_msg。由于某些邮件会被复制,因此表格可能会变大,但如果您担心,可以随时删除旧的阅读邮件。