重新排序聊天选项卡,使包含最新接收或发送消息的选项卡位于列表顶部

Reorder chat tabs so tabs with newest received or sent messages are on top of list

我正在开发一个简单的 Messenger。

这是聊天 table 的样子:
这是用户 table 的样子:
这是 PinnedUser table 的样子:

通过使用此查询,我可以显示我固定的用户的聊天选项卡(固定到 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

聊天选项卡示例:

当我单击其中一个选项卡时,会显示与该用户的聊天消息。

现在选项卡按用户的名字排序(您可以在上面的查询中看到)。我需要以某种方式做的是,我需要按最新消息订购标签。

因此,如果“Anet”向我发送消息(并且我刷新页面,因为现在我不想使用 AJAX 进行刷新),该选项卡将出现在选项卡列表的顶部。然后,如果“Demo”向我发送消息(我刷新页面,因为现在我不想使用 AJAX),“Demo”选项卡将位于顶部,“Anet”将位于右侧在他下面。所以我需要按“最新收到或发送的消息”对选项卡进行排序,就像 Facebook 在其 Messenger 中一样。

我尝试用 GROUP BY 施展魔法,但我失败了。

您需要检索每个用户最近收到消息的日期 - 为此,我们需要查找 table 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