您好我是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)感谢所有帮助过我的人:)
答案 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
如果有效,请告诉我。