无法查找每个会话的列表消息的查询

时间:2017-03-04 03:36:14

标签: php mysql sql

我有下表。我想得到每个对话的最后一条消息。请帮助您获得正确的查询。

  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的用户之间的讨论ID,5是用于具有id 1和3的用户之间的讨论)和{{1}是讨论中的数字。结果应显示2条消息,因为"您最受欢迎的"是ID为1和2的用户与第二条消息之间的最后一条消息"这些天你在哪里?"是ID为1和3的用户之间的最后一条消息

我尝试了许多查询,例如

ID2

注意:现在我只想要用户的最后一个( 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) }观点。

2 个答案:

答案 0 :(得分:0)

这可能会对您有所帮助:


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

此处'id'(您可以根据需要使用,即时间戳)是您的专栏名称,您将获得限制为1的降序,以便您收到最后一条消息。

答案 1 :(得分:0)

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

以下示例是SELF JOIN。第一个查询是最重要的。它类似于你已经写过的那些。它使用GROUP BY子句。它只返回两行。这些行表示每个会话的最后一条消息时间戳。然后我们将这两行连接回主表以获取消息。我们加入ON id和最大时间戳。

this

上面的SQL获得了您想要的结果。它让我们

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

请注意,因为您的表只包含包含User1的对话,所以第一个查询中的WHERE子句完全是可选的。如果删除它,您将获得相同的结果集。另外 - 因为看起来ID2会以递增的方式自动递增 - 您可以将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 更改为MAX(TimeStamp)并获得相同的结果集。就像我说的,不止一种方式。

希望这有帮助!

示例SQL小提琴Here。 你想要的行在下面。

enter image description here