2010-06-16 52 views
0

我有一个系统有用户(发件人)可以给朋友(接收者)写一个便条,接收者数量> = 0。消息文本保存在数据库中,发件人和所有接收者都可以看到,然后他们登录系统。发件人可以随时添加更多的接收者。任何接收者都可以编辑消息甚至从数据库中删除它。对于这个系统我创建3个表,不久:邮件系统数据库结构,需要帮助

用户(用户ID,用户名,密码)
消息(MESSAGEID,文本)
列表(ID,senderID,receiverID,MESSAGEID)

在表 “列表” 的每一行对应于配对发送器 - 接收器,如

sender_x_ID - receiver_1_ID - message_1_ID
sender_x_ID - 重ceiver_2_ID - message_1_ID
sender_x_ID - receiver_3_ID - message_1_ID

现在的问题是:
1.如果用户从表“信息”删除邮件如何自动从表“名单”中删除的所有行这对应于已删除的消息。我是否需要包含一些外键?

更重要的是:
2.如果发件人已经让说3个人接他的MESSAGE1(USERNAME1,USERNAME2和USERNAME3),并在某一时刻决定添加username4和username5,并在同一时间从接收器的列表中排除USERNAME1 。 PHP代码将获得接收机(USERNAME2,USERNAME3,username4,username5)这意味着插入到餐桌 “名单”

sender_x_ID的新名单 - receiver_4_ID - message_1_ID
sender_x_ID - receiver_5_ID - message_1_ID

并且还从表中删除“列表”对应于用户1的行(这不是在该列表或接收器的任何更多)

sender_x_ID - receiver_1_ID - message_1_ID

从PHP发送哪个sql查询使其以一种简单而智能的方式实现?请帮忙! SQL查询的例子将是完美的!

+1

为什么没有senderId作为信息表中的列? – 2010-06-16 17:21:31

+0

thx莫龙,好点!:) – Anna 2010-06-17 11:15:14

回答

2

你的第一个问题很简单。您可以通过在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 
+1

我希望有人很快从条码工厂救你。 – John 2010-06-16 17:37:08

+0

谢谢你的帮助。 只是一个问题,我不知道哪一行从列表中删除:( 我的脚本获取接收者列表(如:rec1,rec2,rec10,rec12 ..),也许首先我将不得不从表中删除“列表“与message_1_ID所有行,然后插入新的接收器新行。是否有可能使其在更简单的方法? 再次谢谢:) – Anna 2010-06-17 11:22:47

+0

嗯,你可以做三件事情之一。您可以删除全部,然后重新插入。你可以删除所有'WHERE receiverID不在('rec1','rec2','rec10','rec12')'(所以只删除那些你不会添加的)。或者,您可以先选择全部,循环并删除一次删除的项目。我个人会做第二个(这是最简单和最一致的)... – ircmaxell 2010-06-17 12:19:12