消息系统的inbox sql查询

时间:2012-01-17 20:54:47

标签: php mysql

使用php和mysql建立一个消息系统,我正在使用本教程作为我的指南 http://aaronsaray.com/blog/2010/07/27/facebook-message-system-in-php

正在处理收件箱页面并且因为它不会选择已经阅读的邮件而遇到问题,因此当用户打开收件箱以查找先前的邮件时,会显示一个空白页面,因为查询不会选择他们已阅读的消息。

这是查询

   $sql =  "select m.mid, m.seq, m.created_on, m.created_by, m.body, r.status from message_recips r
            inner join ".$this->msg_table." m on m.mid=r.mid and m.seq=r.seq 
            where r.uid=".$this->user_id." and r.status in ('A', 'N')
            and r.seq=(select max(rr.seq) from message_recips rr where rr.mid=m.mid and rr.status in ('A', 'N'))
            and if (m.seq=1 and m.created_by=".$this->user_id.", 1=0, 1=1)
            order by m.created_on desc";

这是对教程

中查询的解释
  

首先要获取消息的两个标识符   (MID / SEQ),当它被创建时(所以我们可以显示日期),谁创建了   它(所以我们可以展示发起人或者是'来自'),以及   状态。该状态仅用于显示该消息是否为新消息。

     

sql首先从recips表中获取数据。这是指针   应该是初始消息的所有“副本”   可用。请注意,消息表本身已连接,因此我们可以   获取邮件的实际内容。接下来,收件人UID是   已验证为当前用户,并且消息必须为New或   活性。接下来,序列号必须是特定的序列号。在这种情况下   完成了一个子选择。最大序列号(这样就可以了   它来自recips表,其中该消息是当前的消息   消息,状态不会被删除。在这种情况下,我们不会验证   该子选择的UID是任何用户,因为我们想要显示任何用户   创始人无论是自己还是其他人。最后一部分   where子句验证序列号不是1和它的序列号   不是由我们当前的用户创建的。如果它是1,那意味着它是第一个   线程的消息,由我们创建,我们不应该选择它。   您的收件箱永远不会显示您最初发送的项目   没有收到回复。

     

然后,其余的很简单。检索所有项目。一个   生成循环并显示每个“最新”消息,并带有链接   查看它。但请注意,视图链接仅具有MID。我们没有   需要知道序列号,因为我们将展示整个序列号   线程。

如何修改此查询?

1 个答案:

答案 0 :(得分:1)

使用您提供的网站:

 we have a STATUS column – which will be N for new, A for active (or read) and D for deleted.

在您的SQL查询中:

and r.status in ('A', 'N')

这意味着它将同时选择(N)ew和(A)ctive / Read消息。如果您想要显示 ONLY 活动/已读消息,请将上面一行更改为:

and r.status='A'

如果您仍然遇到问题,请查看您的MySQL表格,并确保在阅读后消息状态更新为“A”,并且不会被删除或标记不同。

此外,只是为了进行问题排查,请回显$sql并查看$this->msg_table中没有空格,并且$this->user_id正在正常显示。