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