1

我有这个 SQL(SQLite 数据库),它正确地从按会话 ID 分组的消息表中获取最新消息,其中消息的会话 ID 不是“无”。

SELECT * from messages 
WHERE _id
IN ( 
   SELECT MAX(_id)
   FROM messages
   WHERE conversation_id != 'none'
   GROUP BY conversation_id
   ) 

但是,我想使用对话表中的“unseenreplies”列(其中包含此对话的未见回复的数量)来对发出的消息进行排序。

我试过这个:

SELECT * from messages
WHERE _id IN 
(
   SELECT max(_id) from messages m
   JOIN conversations c 
   ON m.conversation_id = c.cid ORDER BY 
   c.unseenreplies DESC 
   where m.conversation_id != 'none' group by m.conversation_id ) 

但是在“where”子句附近出现语法错误。

只是作为解释,“对话 ID”不是对话表的主键,而是一个标识符字符串。

我怎样才能解决这个问题?我的 JOIN 方法是否可行?

4

2 回答 2

1

JOIN它们而不是IN谓词:

SELECT * 
from messages AS m1
INNER JOIN conversations c1 ON m1.conversation_id = c1.cid
INNER JOIN 
(
   SELECT max(_id) AS MAxId 
   from messages m
   where m.conversation_id != 'none' 
   GROUP BY m.conversation_id 
) AS m2 ON m1._id = m2.MaxId
ORDER BY  c.unseenreplies DESC 
于 2013-05-19T11:44:25.243 回答
0

您不必删除该in语句即可使其正常工作。关键是 和 之间的conversations连接messages

SELECT m.*
from messages m join
     conversations c
     on m.conversation_id = c.cid
WHERE _id
IN ( 
   SELECT MAX(_id)
   FROM messages
   WHERE conversation_id != 'none'
   GROUP BY conversation_id
   ) 
order by c.unseenreplies desc

另外,请注意,这只会从messages表中提取列,而不是所有列。

于 2013-05-19T13:29:33.297 回答