0

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

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

所以我不问代码,我问如何解决这个问题

4

4 回答 4

2

如果我对问题的理解正确,您只需将两组条件“或”在一起。如果我是发送者deleteBySender != 1或者我是接收者并且deleteByReceiver!=1.

所以像:

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

其中,当然<MYID>是由查看者的用户 ID 代替。

于 2013-11-14T21:47:30.823 回答
0

您需要对发送者和接收者进行不同的查询:

  • 对于接收器(如您所述)select * from inbox where deletedByReceiver != 1
  • 供发件人使用select * from inbox where deletedBySender != 1
于 2013-11-14T21:44:44.487 回答
0

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

于 2013-11-14T21:45:45.637 回答
0

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

消息表:

msgstr* | 发件人ID | 留言内容 | ts

收件箱表:

编号* | msgid_fk | 收件人 ID

要阅读您的消息:

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

然后,您可以为发件人删除邮件时创建触发器,它也会在收件人收件箱中删除该邮件。这也将允许多个收件人在一次存储消息时接收相同的消息。

于 2013-11-14T21:54:53.480 回答