簡體   English   中英

重新排序聊天選項卡,使包含最新接收或發送消息的選項卡位於列表頂部

[英]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.

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