簡體   English   中英

私信系統查詢

[英]Query for private messaging system

我正在使用 mysql 制作私人消息系統。 創建了這個表:

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

表 user_has_messages 存儲消息傳遞歷史記錄,因此每 1 條消息有 2 行(用於“發送者”用戶和“接收者”用戶。)。 每條消息 2 行,因為即使接收者刪除了消息,發件人也應該看到他的消息。 所以我需要獲取包含最后一條消息的具體用戶的所有對話框列表。 如果你看一下這張照片應該更容易理解:解釋

問題是我無法為此任務構建適當的查詢。 也許糟糕的數據庫設計?

看起來這個查詢是我需要的:

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 

我相信數據庫設計可能是錯誤的,因為如果收件人刪除了他的消息(通過刪除 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) 是唯一鍵)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM