如何通过php

时间:2015-11-24 15:20:12

标签: mysql message

在这篇文章之前可能已经多次询问过这个问题,但我找不到合适的答案,这完全符合我的要求。

假设我有两个表:

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-3msg_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表?

2 个答案:

答案 0 :(得分:0)

为什么不直接在表中添加一个状态(1 =读取,0 =未读)的列(布尔值),在打开某个消息时会更新要读取的状态。

table-3:read_msg

id | user_id | MSG_ID |读

1 | 1 | 1 | 0

1 | 1 | 2 | 1

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
。由于某些邮件会被复制,因此表格可能会变大,但如果您担心,可以随时删除旧的阅读邮件。