我有下表。我想得到每个对话的最后一条消息。请帮助您获得正确的查询。
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)
}观点。
答案 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。 你想要的行在下面。