[英]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.