重新排序聊天选项卡,使包含最新接收或发送消息的选项卡位于列表顶部
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
我正在开发一个简单的 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