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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL - 根据字段选择LEFT JOIN列的最后几行。相关的知识,希望对你有一定的参考价值。

我正在建立一个移动聊天网络应用,我遇到了一个问题。直接进入问题,我有一个屏幕,显示所有用户的消息列表(像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

答案

为了解决这个问题,我研究了很多东西。在分组时,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

我想我得到了预期的输出

以上是关于MySQL - 根据字段选择LEFT JOIN列的最后几行。的主要内容,如果未能解决你的问题,请参考以下文章

MySQL LEFT JOIN 多个条件

mysql left join,right join,inner join的区别

Mysql之inner join,left join,right join详解

Sql_join left right

MySQL 的 2 个字段上的 SQL LEFT-JOIN

MySQL LEFT JOIN json 字段与表中的另一个 id