我有一个系统,用户(发送者)可以给 friend (接收者)写一条便条,接收者数量> = 0。消息文本保存在数据库中,发送者和所有接收者都可以看到,然后他们登录系统。发送者可以随时添加更多接收者。更重要的是,任何接收者都可以编辑消息,甚至将其从数据库中删除。对于这个系统,我很快创建了 3 个表:
users(userID, username, password)
messages(messageID, text)
list(id, senderID, receiverID, messageID)
在表“列表”中,每一行对应于发送者-接收者对,例如
sender_x_ID -- receiver_1_ID -- message_1_ID
sender_x_ID -- receiver_2_ID -- message_1_ID
sender_x_ID -- receiver_3_ID -- message_1_ID
现在的问题是:
1.如果用户从表“messages”中删除消息,如何自动删除表“list”中与已删除消息相对应的所有行。我必须包含一些外键吗?
更重要的是:
2. 如果发送者为他的消息 1 指定了 3 个接收者(用户名 1、用户名 2 和用户名 3),并且在某个时刻决定添加用户名 4 和用户名 5,同时从接收者列表中排除用户名 1。 PHP 代码将获取新的接收者列表(username2、username3、username4、username5),这意味着插入到表“list”
sender_x_ID -- receiver_4_ID -- message_1_ID
sender_x_ID -- receiver_5_ID -- message_1_ID
并从表“list”中删除与 user1 对应的行(不再在列表或接收者中)
sender_x_ID -- receiver_1_ID -- message_1_ID
从 PHP 发送哪个 SQL 查询才能以简单而智能的方式实现?请帮忙! sql查询的例子就完美了!
最佳答案
你的第一个问题很简单。您可以通过在 list
上设置外键来做到这一点。您可以将其设置为CASCADE
更新和删除(以便DELETE FROM messages WHERE messageID = 5
会自动删除list
中的所有行,其中messageID = 5 以及。您需要使用 InnoDB
作为存储引擎才能使其工作...
对于第二个问题,这也很简单。只需在一个查询中插入新行即可:
INSERT INTO list (senderID, receiverID, messageID)
VALUES (sender_x_id, receiver_4_id, message_1_id),
(sender_x_id, receiver_5_id, message_1_id);
然后删除另一个中的其他内容:
DELETE FROM list
WHERE receiverID = receiver_1_id
AND messageID = message_1_id
关于php - 邮件系统数据库结构,需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3055542/