Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何通过php维护已读/未读消息_Mysql_Message - Fatal编程技术网

Mysql 如何通过php维护已读/未读消息

Mysql 如何通过php维护已读/未读消息,mysql,message,Mysql,Message,这个问题在这篇文章之前可能被问过很多次,但我找不到一个合适的答案,这个答案完全符合我的要求 假设我有两张桌子: table-1: table_msg ------------------------------------------------------- msg_id | msg_subject | create_time ------------------------------------------------------- 1 | welco

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

假设我有两张桌子:

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
    -------------------------------
我几乎一直都能看到解决方案,因为
用户id-1
的最后一次登录是在
msg\u id-3
之前,所以如果
用户id-1
登录
2015-06-02
,他会有两条新消息
msg\u id-3
msg\u id-4
。我可以用css加粗这两条消息的主题,将其显示为
未读
。现在假设在登录
user\u id-1
后打开了
msg\u id-4
,但没有打开
msg\u id-3
,因此
msg\u id-3
仍然是
未读的

现在,当同一用户再次登录
2015-06-20
,然后在他上次登录后,
msg_id-5
可以很容易地识别为
未读
,因为它是在他上次登录后发布的
2015-06-02
,它可以变为粗体,但是在他上次登录之前发布但仍然没有打开的
msg_id-3
呢。它也是
未读的
,应该是粗体

如果没有下面这样的单独表格,我如何将
msg_id-3
识别为
未读

table-3: read_msg
------------------------
 id | user_id | msg_id
------------------------
  1 |    1    |    1
------------------------
  1 |    1    |    2
------------------------
  1 |    1    |    4
------------------------
table-3
适合少数用户,但如果用户数为5000,总消息数为10000或更高,那么对于mysql引擎来说,该表将是一个相当大的处理空间,并且它将以几何形式日益增大

是否有任何机制/技术或算法,以便与上次登录后发布的消息一起,在上次登录之前未打开的消息也可以被识别为
未读
,而无需庞大的
read\u msg
表格

为什么不在表中添加一个状态为(1=已读,0=未读)的列(布尔值),在打开某条消息时,该列会将状态更新为已读

表3:读取信息 id |用户id |消息| id |读取 1 | 1 | 1|0 1 | 1 | 2|1 1 | 1 | 4 | 0

考虑以下场景:

用户登录后有7条未读消息。他选择只读1。如果您创建一个查询/算法来使用他的上次登录时间查看未读邮件,它将看到他在邮件发布后登录。但是他读了吗?不…

为什么不在表中添加一个状态为(1=已读,0=未读)的列(布尔值),在打开某条消息时,该列将更新状态为已读

表3:读取信息 id |用户id |消息| id |读取 1 | 1 | 1|0 1 | 1 | 2|1 1 | 1 | 4 | 0

考虑以下场景:


用户登录后有7条未读消息。他选择只读1。如果您创建一个查询/算法来使用他的上次登录时间查看未读邮件,它将看到他在邮件发布后登录。但是他读了吗?不…

我刚刚注意到,正如您所描述的,您有一个表包含消息。这些信息是给每个人的。我认为达维加尔假设,正如我所做的那样,这些消息是针对每个用户的。在这种情况下,每个用户的每条消息在表_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; 从表_msg中选择*,其中user_id=1,read=0;
这是我能想到的避免第三个表被读取的唯一方法。该表可能会变大,因为某些消息会被复制,但如果您担心这一点,则始终可以删除旧的已读消息。

我刚刚注意到,正如您所述,您有一个表包含这些消息。这些信息是给每个人的。我认为达维加尔假设,正如我所做的那样,这些消息是针对每个用户的。在这种情况下,每个用户的每条消息在表_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
 ----------------------------------------------------------------------
read_msg 那么你只需要做:

select * from table_msg where user_id = 1 and read = 0; 从表_msg中选择*,其中user_id=1,read=0;
这是我能想到的避免第三个表被读取的唯一方法。表可能会变大,因为有些消息会被复制,但如果您担心这一点,您可以随时删除旧的已读消息。

read
列可以在只有一个用户时执行(将其设置为1),但如果有1000个用户甚至2个用户,您如何区分
1
是哪个用户的,
user\u id-1
user\u id-2
?抱歉,认为消息是特定于用户的,更新了答案
read
列,如果只有一个用户,则可以(通过将其设置为1)执行此操作,但如果有1000个用户甚至2个用户,您如何区分
1
是哪个用户,
user\u id-1
user\u id-2
?抱歉,虽然消息是特定于用户的,但更新了answer10000消息对MySQL来说不算什么。对于正确的索引,数百万行是微不足道的。10000条消息对于MySQL来说不算什么。如果索引正确,数百万行是微不足道的。假设我有5000个用户,那么在给出一条帖子/消息后,在
表\u msg
中插入5000行,如果平均每天发布500条消息,那么每天将插入大约2500000行。每个用户每天都不会登录是正常的,因此,如果平均1000个用户在1个月内不会登录,您能想象在1或3个月后,
table_msg
中将有多少行吗?我理解您的意思,但SQL是为大型数据集设计的。如果您正确地为表编制索引,或者简单地删除旧的已读消息,那么选择简单行的基本方法就不会有任何问题。你要么有一对多的关系,要么有多对多的关系,并且已经知道实现它们的两种方法。假设我有5000个用户,那么在给出一条帖子/消息后,在
表中插入了5000行。\u msg
,如果平均每天发布500条消息,那么大约会有2500000行 read_msg