类似会话的消息传递系统

时间:2013-11-14 21:40:40

标签: php mysql

我建立了类似Facebook消息的消息系统。对话是在一个mysql表中进行的,所以我有receiverId, senderId, messageContent ... 我的问题是,我想实现“删除消息”功能,但我不知道如何制作它,所以如果该会话的一个成员删除所有消息,其他成员仍应看到所有消息,直到其他成员删除这些消息消息也是如此。

所以我的方法(显然是错误的)是添加其他列:deletedByReceiver和deletedBySender,这适用于接收者,但如果发件人打开这些​​消息,那么他只会看到他发送的消息,因为我的查询说:select * from inbox where deletedByReceiver != 1

所以我不要求代码,我想知道如何解决这个问题

4 个答案:

答案 0 :(得分:2)

如果我理解正确的问题,你只需要将两组条件“或”在一起。如果我是发件人和deleteBySender != 1,或者我是接收者和deleteByReceiver!=1,则需要包含该邮件。

类似于:

SELECT * FROM inbox 
WHERE 
    (senderId = <MYID> AND deleteBySender!=1) OR 
    (receiverID = <MYID> and deleteByReceiver!=1)

当然,<MYID>替换为查看者的用户ID。

答案 1 :(得分:0)

您需要对发件人和收件人进行不同的查询:

  • 为接收者(如您所述)select * from inbox where deletedByReceiver != 1
  • 供发件人使用select * from inbox where deletedBySender != 1

答案 2 :(得分:0)

如果您希望每个用户都能够在自己的视图中删除邮件,则似乎需要使用messageId, userId在邮件和用户之间添加创建关联表。表中的一行表示此用户已删除此消息。您还可以使此表更通用,并具有deleted列(是/否)。这样你也可以管理权限......

答案 3 :(得分:0)

我会使用两个表系统,一个用于消息,一个用于收件箱。它会增加数据库的大小,但它会允许消息始终存在,但收件人会从视图中删除它

消息表:

  msgstr * | senderId | messageContent | TS

收件箱表:

  

id * | msgid_fk | recipientId

阅读邮件:

  

SELECT * FROM messages m JOIN inbox i ON m.msgid = i.msgid_fk WHERE recipientID ='[recipient]'

然后,您可以创建触发器,以便在发件人删除邮件时将其删除为收件人收件箱。这也将允许多个收件人在存储邮件一次时收到相同的邮件。