收件箱消息系统的sql查询


inbox sql query for messaging system

我用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为已验证为当前用户,并且消息必须为"新建"或忙碌的接下来,序列号必须是一个特定的序列号。在这种情况下则完成子选择。最大序列号(因此它是最新的),其中该消息是当前消息消息,并且状态未被删除。在这种情况下,我们不验证该子选择的UID是任何用户,因为我们要显示无论是我们自己还是其他人。的最后一部分where子句验证序列号不是1,并且不是由我们的当前用户创建的。如果是1,则表示它是第一个线程的消息,由我们创建,并且我们不应该选择它。您的收件箱从不显示您最初发送的项目,但没有收到任何回复。

那么,剩下的就很简单了。将检索所有项目。A.生成循环,每个"最新"消息都显示一个指向请注意,视图链接只有MID。我们没有需要知道序列号,因为我们将显示整个线

应该如何修改此查询?

使用您提供的网站:

 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)active/Read消息。如果您想显示ONLY活动/已读消息,请将上面的行更改为:

and r.status='A'

如果你仍然有问题,请检查你的MySQL表,并确保消息状态在读取后更新为"A",而不是被删除或以不同的方式标记。

此外,为了排除故障,请回显$sql,并检查$this->msg_table中是否没有空格,以及$this->user_id是否正确显示。