MySQL - 根据字段选择LEFT JOIN列的最后几行。

问题描述 投票:0回答:1

我正在建立一个移动聊天网络应用,我遇到了一个问题。直接进入问题,我有一个屏幕,显示所有用户的消息列表(像WhatsApp)。我想显示列表中的用户之间最后发送或接收的消息(如下图所示)。我现在的查询是从第一行提取所有用户的消息。这不是我想要的。

更多简单的细节发生了什么

如你所见 messages 表,字段 msg_frommsg_to 分别代表发送方和接收方。在我的数据中,消息在用户1& 8和用户1& 11之间传输。msg_message Are you there? 同样地,对于用户1 & 11,最后要获取的记录将是记录10,它有 msg_message Would you like to join?. 但目前,对所有用户来说,获取的记录是第一条记录的信息 How are you?. 我的查询应该做哪些改动才能得到想要的结果?请看下面的提琴。

这里的提琴。DB Fiddle

WhatsApp Screenshot

php mysql sql
1个回答
1
投票

为了解决这个问题,我研究了很多东西。在分组时,groupBy会取非分组列的第一行(吸为msg_message),所以我们在加入时可以借助子查询来排序,就像这样。

SELECT swp_by, swp_to, msg_from, msg_to, mem_fname, mem_lname, mem_last_activity, msg_message, GREATEST(MAX(msg_time), swipes.swp_date) as msgdate, COUNT(msg_id) as msgcnt FROM swipes

LEFT JOIN 
(
  SELECT * FROM messages order by msg_time desc  -- this is the magic, we use this subquery to order before grouping       
) 
messages ON 
((
     messages.msg_from = swipes.swp_by 
     AND messages.msg_to = swipes.swp_to) 
     OR (messages.msg_from = swipes.swp_to 
     AND messages.msg_to = swipes.swp_by
))

解决方案在你的摆弄中。https:/www.db-fiddle.comfxnh4jiUb8rDLFHpL2gWHrM5

enter image description here

我想我得到了预期的输出

© www.soinside.com 2019 - 2024. All rights reserved.