2010-06-16 123 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