[英]Reorder chat tabs so tabs with newest received or sent messages are on top of list
我正在研究一個簡單的信使。
這是 Chat 表的樣子:
這是用戶表的樣子:
這是 PinnedUser 表的樣子:
通過使用此查詢,我可以顯示我固定的用戶的聊天選項卡(固定到 Messenger,以便我可以與他們聊天)。
SELECT pu.*, u.* FROM User u JOIN PinnedUser pu ON pu.pinned_user = u.user_id
WHERE pu.pinned_by_user = $actual_user ORDER BY u.first_name ASC
當我單擊其中一個選項卡時,會顯示與該用戶的聊天消息。
現在選項卡按用戶名排序(您可以在上面的查詢中看到)。 我需要以某種方式做的是,我需要按最新消息訂購標簽。
因此,如果“.net”向我發送消息(並且我刷新頁面,因為現在我不想使用 AJAX 進行刷新),該選項卡將出現在選項卡列表的頂部。 然后,如果“Demo”向我發送一條消息(我刷新頁面,因為現在我不想使用 AJAX),“Demo”選項卡將位於頂部,“.net”將位於他的正下方。 因此,我需要按“最新收到或發送的消息”對選項卡進行排序,就像 Facebook 在其信使中一樣。
我試圖用GROUP BY
施展魔法,但我失敗了。
您需要檢索每個用戶最近收到消息的日期 - 為此,我們需要查找表chat
。 您可以直接在where
子句中加入或使用相關子查詢:
select pu.*, u.*
from user u
join pinneduser pu on pu.pinned_user = u.user_id
where u.user_id = ?
order by (
select coalesce(max(send_at), '200-01-01')
from chat c
where c.sender_id = pu.pinned_user_id and c.receiver_id = u.user_id
) desc
coalesce()
在那里,以防找不到消息,在這種情況下,固定用戶應該排在最后(這假設您在 2k 年之前沒有消息)。
您可能還想檢索消息日期,將其顯示在您的應用程序中,否則(在這種情況下我們不需要默認值):
select
pu.*,
u.*,
(
select max(send_at)
from chat c
where c.sender_id = pu.pinned_user_id and c.receiver_id = u.user_id
) latest_message_sent_at
from user u
join pinneduser pu on pu.pinned_user = u.user_id
where u.user_id = ?
order by (latest_message_sent_at is null), latest_message_sent_at desc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.