繁体   English   中英

邮件系统的收件箱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,则表示它是由我们创建的线程的第一条消息,我们不应选择它。 收件箱永远不会显示您最初发送但没有收到回复的项目。

然后,剩下的就很简单了。 检索所有项目。 会生成一个循环,并显示每个“最新”消息及其链接以进行查看。 但是请注意,视图链接仅具有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消息。 如果你想显示有效/读取消息,更改上面一行改为:

and r.status='A'

如果仍然有问题,请检查您的MySQL表,并确保在读取消息状态后将它们更新为“ A”,并且不会被删除或标记为不同。

另外,只是为了进行故障排除,请回显您的$sql并查看$this->msg_table中没有空格,并且$this->user_id正确显示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM