【问题标题】:Sqlite Order by Before Group By Like MysqlSqlite Order by Before Group By Like Mysql
【发布时间】:2015-11-05 09:36:19
【问题描述】:

我正在开发一个 android sqlite db

我有 2 个表:chat、chat_messages

chat  
|_id |chatName      
 1   first
 2   second

chat_messages 
|_id |Chat_chatId |chatMessageContent |chatMessageId
 1      1         ttyl              4
 2      1         busy              3
 3      2         hi                2
 4      1         hi howdy          1

我想显示一个页面,显示每次聊天的最新 chatMessageContent 如下所示

result
|chatName |chatMessageContent  |chatMessageId 
first      ttyl                4
second     hi                  2

由于从服务器恢复的数据有问题,每次聊天的最新chatMessageContent需要跟随chatMessageId desc

如果 Mysql 子查询有效

Select * from (Select c._id,c.chatName,cm._id,cm.chatMessageContent,cm.chatMessageId from chat c, chat_message cm where cm.Chat_chatId = c._id order by cm.chatMessageId desc ) as lc GROUP BY lc.Chat_chatId

但它不适用于 sqlite

【问题讨论】:

  • 嗯?没有聚合函数的 GROUP BY 有什么意义?有一个不同的
  • 我对 DISTINCT 不熟悉,是不是和 GROUP BY 类似??

标签: android mysql sqlite sql-order-by


【解决方案1】:
SELECT c.chatName, cm.chatMessageContent, cm.chatMessageId FROM chat_messages cm
INNER JOIN chat c ON c._id = cm.Chat_chatId
INNER JOIN (SELECT MAX(chatMessageId) as maxid, Chat_chatId FROM chat_messages GROUP BY Chat_chatId) AS t ON t.maxid=cm.chatMessageId

子查询确保每次聊天都获得最大的 chatMessageId。通过将其内部连接到 chatmessages 表,您可以消除所有其他聊天消息,并且您也可以从 chatmessages 表中查询其他字段。

【讨论】:

    【解决方案2】:

    试试这个查询,我认为这是适合您的一种解决方案。这不是更好的解决方案,但是..

    SELECT * FROM chat_messages  t
    JOIN chat c ON c._id = t.Chat_chatId
    WHERE chatMessageId = (
        SELECT MAX(t2.chatMessageId) 
        FROM chat_messages  t2
        WHERE t2.Chat_chatId = t.Chat_chatId
    )
    

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2012-05-06
      • 2021-02-22
      • 2011-07-18
      相关资源
      最近更新 更多