2011-06-08 101 views
1

我正在使用mysql進行私人消息系統。創建此表:查詢私人消息系統

1) users (id, name) 
2) messages(id, text, created) 
3) user_has_messages(id, user_id, message_id, is_sender) 

表user_has_messages存儲短信歷史,所以有2行(對於「發送者」的用戶和爲「接收器」的用戶。)每1個消息。每條消息2行,因爲即使接收者刪除了它,發件人也應該看到他的消息。 所以我需要獲取具有最後一條消息的具體用戶的所有對話框列表。如果你看一下這張圖,應該會比較容易:Explanation

問題是我無法爲此任務構造正確的查詢。也許壞的數據庫設計?

回答

1

貌似這個查詢是什麼,我需要:

SELECT * FROM users_has_messages uhm1 
WHERE uhm1.message_id=(
     SELECT message_id FROM users_has_messages uhm2 
     WHERE (uhm1.receiver_id=uhm2.receiver_id AND uhm1.sender_id=uhm2.sender_id) 
     OR uhm1.receiver_id=uhm2.sender_id ORDER BY message_id DESC limit 1) 
AND user_id=1 
0

我認爲數據庫設計可能是錯誤的,因爲如果收件人刪除了他的消息(通過刪除user_has_messages行),那麼發件人不能再看到他們發送給誰 - 信息丟失。

如果消息總是有一個發件人和收件人,那麼我將有表所示:

1) users (id, name) 
2) messages(id, text, created, sender_id, recipient_id, 
      deleted_by_sender, deleted_by_recipient) 

即使這樣簡單的設計爲您的要求SQL有點複雜:

select m.recipient_id, m.text 
from messages m 
where m.sender_id = ? 
and m.created = (select max(created) 
       from messages m2 
       where m2.sender_id = m.sender_id 
       and m2.recipient_id = m.recipient_id 
       and m2.deleted_by_sender = 0 
       and m2.deleted_by_recipient = 0); 

(並假定(sender_id,recipient_id,created)是唯一鍵)。

+0

又是怎麼回事事實上,在對話框中的最後一條消息可以屬於「發件人」或「接收器」? – trerums 2011-06-08 12:23:53

+0

好點,我的SQL只處理用戶發送的消息。 – 2011-06-08 12:26:33