繁体   English   中英

找不到查询每个对话的列表消息的麻烦

[英]trouble to find query for list messages of each conversation

我有下表。 我想获取每次对话的最新消息。 请帮助进行适当的查询以获取它。

  ID   ID2   User1   User2           Message                 TimeStamp         
 ---- ----- ------- ------- ------------------------- ------------------------ 
   1     1       1       2   hii                       March, 04 2017 8:30:00  
   1     2       2       1   hey bro                   March, 04 2017 8:31:00  
   1     3       1       2   hw are u?                 March, 04 2017 8:32:00  
   1     4       2       1   good,thnks4asking         March, 04 2017 8:33:00  
   5     1       3       1   r u there?                March, 04 2017 8:34:00  
   5     2       1       3   yup,say                   March, 04 2017 8:35:00  
   5     3       3       1   hw are u?                 March, 04 2017 8:36:00  
   5     4       1       3   m fine                    March, 04 2017 8:37:00  
   5     5       3       1   where are u these days?   March, 04 2017 8:38:00  
   1     5       1       2   your most welcom :D       March, 04 2017 8:39:00

这里ID是讨论ID(聊天ID说,例如图1是具有id为1和2和5的用户之间的讨论ID是用于具有id为1的用户和之间的讨论3)和ID2是在讨论的数目。 结果应显示2条消息,因为“您最受欢迎”是ID为1和2的用户之间的最后一条消息,而第二条消息为“您最近在哪里?” 是ID为1和3的用户之间的最后一条消息

我尝试了很多查询

 SELECT message ,MAX(id2) 
 FROM pm 
 WHERE user1=1 OR user2=1 
 GROUP BY id

 SELECT message 
 FROM pm 
 WHERE user1=1 OR user2=1 
 GROUP BY id 
 HAVING id2=MAX(id2)

注意:现在,我只希望从用户(具有ID=1 )的角度来看最后一个。

这可能对您有帮助:

select * from pm where user1 = 1 order by id desc limit 1;

这里的“ id”(您可以根据需要使用,即时间戳)是您的列名,该列名的上限为1,因此您将获得最后一条消息。

有多种方法可以做到这一点。 您走在正确的轨道上。 我认为您只需要使用JOIN。

下面的示例是一个SELF JOIN。 第一个查询是最重要的。 它类似于您已经编写的内容。 它使用GROUP BY子句。 它仅返回两行。 这些行代表每个对话的最后一个消息时间戳。 然后,我们将这两行连接回主表以获取消息。 我们加入ID和最大时间戳。

SELECT *
FROM (
  /* Get the latest message timestamp for each conversation. */
  SELECT ID, MAX(TimeStamp) AS MaxTimeStamp
  FROM Conversations
  WHERE User1 = 1 OR User2 = 1
  GROUP BY ID
) AS A
LEFT JOIN (
  /* Get the message */
  SELECT ID, Message, TimeStamp
  FROM Conversations
) AS B
ON A.ID = B.ID
AND A.MaxTimeStamp = B.TimeStamp

上面的SQL获得所需的结果。 它让我们

User1与任何人进行的每次对话的最后一条消息

请注意,由于您的表仅包含包含User1的对话,因此第一个查询中的WHERE子句是完全可选的。 如果将其删除,您将获得相同的结果集。 另外-由于ID2似乎正在以递增方式自动递增-您可以将MAX(TimeStamp)更改为MAX(ID2)并获得相同的结果集。 就像我说的,不止一种方式。

希望这可以帮助!

例如SQL小提琴这里 您要的行如下。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM