Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 重新排序聊天选项卡,使包含最新接收或发送消息的选项卡位于列表顶部_Php_Mysql_Sql_Subquery_Sql Order By - Fatal编程技术网

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

Php 重新排序聊天选项卡,使包含最新接收或发送消息的选项卡位于列表顶部,php,mysql,sql,subquery,sql-order-by,Php,Mysql,Sql,Subquery,Sql Order By,我在做一个简单的信使 这是聊天表的外观: 这是用户表的外观: 这是PinnedUser表的外观: 通过使用此查询,我可以显示我已锁定的用户的聊天选项卡(锁定到Messenger,以便我可以与他们聊天) 聊天选项卡示例: 当我单击其中一个选项卡时,将显示与该用户的聊天信息 现在,选项卡是按用户的名字排序的(您可以在上面的查询中看到)。我需要做的是,我需要按最新消息来排序标签 因此,如果“Anet”向我发送消息(我刷新页面,因为现在我不想用AJAX),该选项卡将显示在选项卡列表的顶部。然后,

我在做一个简单的信使

这是聊天表的外观:
这是用户表的外观:
这是PinnedUser表的外观:

通过使用此查询,我可以显示我已锁定的用户的聊天选项卡(锁定到Messenger,以便我可以与他们聊天)

聊天选项卡示例:

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

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

因此,如果“Anet”向我发送消息(我刷新页面,因为现在我不想用AJAX),该选项卡将显示在选项卡列表的顶部。然后,如果“Demo”向我发送消息(我刷新页面,因为现在我不想用AJAX),那么“Demo”选项卡将位于顶部,“Anet”将位于他的正下方。因此,我需要按“最新收到或发送的消息”排序标签,就像Facebook在其messenger中一样


我试图用
分组方式
实现这一神奇功能,但失败了。

您需要检索每个用户最新收到的消息的日期-为此,我们需要查找表
聊天
。您可以在
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年之前没有消息)

您可能还需要检索消息日期,以便在应用程序中显示它,或者(在这种情况下,我们不需要默认值):


谢谢你的帮助。不幸的是,第一个解决方案没有改变任何东西,标签仍然没有正确排序,第二个解决方案给了我2个“演示”标签,而不是“Anet”和“演示”标签。很抱歉,我可能误导了你->你的解决方案是正确的,我只是意识到你只是根据收到的消息排序。谢谢你的帮助:)
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
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