mysql查询两个表,检索每个会话的消息

时间:2012-03-12 22:52:33

标签: php mysql sql

我有两张桌子。

其中一个称为“对话”的人有以下数据。

ConversationID  Sender     Reciever
1               bla1       bla2
2               bla1       bla3
3               bla1       bla4

另一个名为“Messages”的数据如下。

MessageID    MessageText    TimeAddedMessage        ConversationID
1             helo           2012-03-12 13:00:00          2
2             helo           2012-03-12 13:01:00          1
3             helo           2012-03-12 13:02:00          3
4             helo           2012-03-12 13:03:00          3
5             helo           2012-03-12 13:04:00          2

我想从查询中获得的结果如下:

5             helo           2012-03-12 13:04:00          2
4             helo           2012-03-12 13:03:00          3
2             helo           2012-03-12 13:01:00          1

这意味着我们需要每个对话的最新评论(按时间排序DESC)。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:3)

尝试 -

SELECT m2.*, c.Sender
FROM (
    SELECT m1.ConversationID, MAX(m1.MessageID) AS MessageID
    FROM Messages m1
    GROUP BY m1.ConversationID
) latest_msg
INNER JOIN Messages m2
    ON latest_msg.MessageID = m2.MessageID
    AND latest_msg.ConversationID = m2.ConversationID
INNER JOIN Conversations c
    ON m2.ConversationID = c.ConversationID
ORDER BY m2.MessageID DESC

编辑我修改了上述查询,以便在Conversations表中包含Sender的值。我注意到你的谈话结构有点奇怪。对话是从一个用户到另一个用户,但是无法识别哪个用户编写了每个消息。这是故意的吗?

答案 1 :(得分:1)

您可以通过使用ConversationID和max TimeAddedMessage创建派生表并将其加入消息来实现:

select Messages.MessageID, Messages.MessageText, 
       Messages.TimeAddedMessage, Messages.ConversationID
  from Messages inner join
  (
    select ConversationID, max (TimeAddedMessage) TimeAddedMessage
      from Messages
     group by ConversationID
  ) LastMessages
  on Messages.ConversationID = LastMessages.ConversationID 
     and Messages.TimeAddedMessage = LastMessages.TimeAddedMessage

答案 2 :(得分:1)

对比较小的数据集具有良好性能的简单查询。

SELECT m1.*
FROM Messages m1 LEFT JOIN Messages m2
 ON (m1.ConversationId = m2.ConversationId AND m1.TimeAddedMessage < m2.TimeAddedMessage)
WHERE m2.MessageID IS NULL;

this post修改。

这种反直觉,但已成为一种常用的食谱配方。