我建立了类似Facebook消息的消息系统。对话是在一个mysql表中进行的,所以我有receiverId, senderId, messageContent ...
我的问题是,我想实现“删除消息”功能,但我不知道如何制作它,所以如果该会话的一个成员删除所有消息,其他成员仍应看到所有消息,直到其他成员删除这些消息消息也是如此。
所以我的方法(显然是错误的)是添加其他列:deletedByReceiver和deletedBySender,这适用于接收者,但如果发件人打开这些消息,那么他只会看到他发送的消息,因为我的查询说:select * from inbox where deletedByReceiver != 1
所以我不要求代码,我想知道如何解决这个问题
答案 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]'
然后,您可以创建触发器,以便在发件人删除邮件时将其删除为收件人收件箱。这也将允许多个收件人在存储邮件一次时收到相同的邮件。