如何构建此SQL查询:选择与上一条消息的对话

时间:2014-01-30 14:59:54

标签: android sql sqlite

您好我是sql的新手,并且非常头疼这样的需求:

有两个表:CONVERSATION和MESSAGE

CONVERSATION: _id INTEGER, description TEXT
MESSAGE: _id INTEGER, message TEXT, conversation_id INTEGER

每个会话都可以包含多条消息。

我需要与他们的最后一条消息(max _id)进行所有对话: Conversation1 +该对话的最后消息(如果不存在则每列都为null)。 例如

 _id       description     message_id              message             conversation_id

 1         conv 1            7             "last message in conv 1           1 

 2         conv 2            12             "last message in conv 2"         2

 3         conv 3           null                   null                     null  
(this conversation has no message)

 ......

15         conv 15          212            "last message in conv 15"         15

我怎么写这个查询?

顺便说一句,如果我需要在android中用sqlite查询,我是否需要查询原始sql或者可以使用一些帮助类来进行此查询?

感谢所有花时间在我的问题上的人!

---------------

我刚写了一个sql查询,我可以请Profies看看吗?

SELECT conversation。*,message._id as message_id,message.message,message.conversation_id 来自CONVERSATION._ID = message.conversation_id上的对话LEFT JOIN消息 group by message.conversation_id,message._id = max(message.id)

==============================

最后我创建了一个sql语句,如下所示:

在conversation._id = conversation_id

中选择*来自会话左连接(从conversation_id中选择max(_id),来自message group的conversation_id)

感谢所有帮助过我的人:)

2 个答案:

答案 0 :(得分:0)

此方法使用相关子查询来获取最后一条消息ID。然后它将其连接回messages表以获取其他信息:

select c.*, m._id, m.message
from (select c.*,
             (select max(_id) as maxid
              from message m
              where c._id = m.conversationid
             ) as messageid
      from conversation c
     ) c join
     message m
     on c.messageid = m._id;

答案 1 :(得分:0)

我们可以在SELECT语句中指定的列必须是完成GROUPing的列的子集。您编写的查询不遵循此规则,因此您可能会收到语法错误。

SELECT con.*, mes._id as message_id, mes.message, mes.conversation_id 
FROM conversation con
LEFT JOIN  
(
SELECT mes1._id, mes1.message, mes1.conversation_id
FROM message mes1 
INNER JOIN
(SELECT MAX(_id) as _maxid
FROM message
GROUP BY conversation_id) mes2
ON mes1._id = mes2._maxid
)mes
ON con._id = mes.conversation_id

如果有效,请告诉我。

相关问题