[英]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.