Android sqlite3按最大值查询并按第二个因子筛选

Android sqlite3按最大值查询并按第二个因子筛选,android,sql,database,sqlite,Android,Sql,Database,Sqlite,我有: 我想: TABLE MESSAGES message_id | conversation_id | from_user | timestamp | message 淘汰 2|145|xxx|10000|message 6|1743|yyy|999|message 7|14|bbb|899|message 具有相同时间戳的示例组 我想从这个组中得到第3行,但我从查询中得到第2行 1|145|xxx|10000|message <- has same timesta

我有:

我想:

TABLE MESSAGES
 message_id | conversation_id | from_user | timestamp  |  message
淘汰

2|145|xxx|10000|message

6|1743|yyy|999|message

7|14|bbb|899|message
具有相同时间戳的示例组

我想从这个组中得到第3行,但我从查询中得到第2行

1|145|xxx|10000|message    <- has same timestamp(10000) as message(2) belongs to the same conversation(145) but message id is lowest  

5|1743|me|1200|message <- has message_from == me 

我想怎么做才能从消息中获得最大值?

好吧,这比我想象的要简单:

基本上要更改,请选择:

SELECT max(message_timestamp), message_id, message_text, message_conversationId
FROM MESSAGES
WHERE message_from <> 'me'
GROUP BY message_conversationId
ORDER by message_Timestamp DESC
致:

因此,它将在时间戳和消息id的串联上搜索max

ps.挖掘后-只有当消息id随着时间戳的增长而增长时,它才起作用。插入顺序保持不变

编辑:

编辑2:

那么它为什么有效呢


两次分组尝试下面的sql以达到您的目的

SELECT max(message_timestamp+message_id), message_timestamp, message_id, message_conversationId, message_from,message_text
FROM MESSAGES
WHERE message_conversationId = 1521521
AND message_from <> 'me'
ORDER by message_Timestamp DESC

您的查询是基于GROUP BY的非标准使用,我认为SQLite只允许与MySQL兼容,我根本不确定它是否会一直产生确定的结果

另外,它在连接的列上使用MAX。除非您以某种方式确保两个连接的列具有固定的宽度,否则结果也不会因此而准确

我将这样编写查询:

select m.*
from
Messages m
-- 3. and then joining to get wanted output columns
inner join
(
    --2. then selecting from this max timestamp - and removing duplicates
    select conversation_id, max(timestamp), message_id
    from
    (
        -- 1. first select max message_id in remainings after the removal of duplicates from mix of cv_id & timestamp
        select conversation_id, timestamp, max(message_id) message_id
        from Messages
        where message <> 'me'
        group by conversation_id, timestamp
    ) max_mid
    group by conversation_id
) max_mid_ts on max_mid_ts.message_id = m.message_id
order by m.message_id;

准备使用示例数据将其迁移到DBA.SE,因为它已在那里交叉发布:,因此可以合并。时间戳上的字符串比较可能错误10<9。选择“20”>“100”返回true,因此,除非您能够确保转换为字符串后的长度不存在两列的长度差异,否则连接不起作用。是的,但我得到的时间戳长度和消息id长度相同,所以如何添加这两个值?IT2起作用,因为时间戳是一个相对较大的数字,但请求id较小。但是,当请求id增长且时间戳变大时,它会遇到这样的问题:它获得的请求id的最大值是时间戳。您最好避免这种情况,因为edit2在条件上是正确的,并且在编程上是不正确的。虽然请求id大于时间戳的情况很少发生,因为表很少如此大。是的,它可以工作,但它与我的方法有何不同?我创建了一个新的专栏,我得到了它的最大值好吧,我可能理解10+100!=101+00,但这两个是10100,谢谢,我想插入where子句:,并设置订单。。但是我试图理解您的查询如果您添加这些类似于字段的字符串,问题是10 | | 20>10 | | 101=>'1020'>'10101',它最终选择较低的消息id.1。首先,在从cv_id和timestamp2的混合中删除重复项后,在remainings中选择max message_id。然后你从这个最大时间戳中选择并删除重复项谢谢@ypercube的帮助!!!在我的例子中,group by与agregation max一起使用-不要在mc上使用任何agregation。。你说的什么意思?我根本不确定它是否会一直产生确定的结果。我看到你使用限制、顺序和加入-daniel使用最大值和加入-你使用不同的类型在var=SELECT daniel的示例中写入查询连接名称JOIN SELECT AS name=对我来说,如果你在AS JOIN上使用一些魔法,读取查询会变得更困难。。等等,哪里是开始,哪里是结束:我看到更多的图形化-如剪切/创建/拆分/合并表:D-因此,看到一些图形化的解释会很好,例如复杂的查询:您的查询具有GROUP BY message\u conversationId,同时选择maxmessage\u时间戳、message\u id、message\u文本。如果有许多行具有相同的conversationId,则将返回最大时间戳。那很好。但是将返回所有消息_id中的哪一个?所有信息中的哪一条?您假设它将是具有最大时间戳的,但我不确定它是否会是这样。它可能是不同的消息id(不是最新消息)和不同的文本。是的,需要来自“我”的消息两次。但无论是否有,我都得到了相同的5000行结果
max(message_timestamp || message_id)   
or  max(message_timestamp + message_id) 
SELECT max(message_timestamp+message_id), message_timestamp, message_id, message_conversationId, message_from,message_text
FROM MESSAGES
WHERE message_conversationId = 1521521
AND message_from <> 'me'
ORDER by message_Timestamp DESC
select m.*
from
Messages m
-- 3. and then joining to get wanted output columns
inner join
(
    --2. then selecting from this max timestamp - and removing duplicates
    select conversation_id, max(timestamp), message_id
    from
    (
        -- 1. first select max message_id in remainings after the removal of duplicates from mix of cv_id & timestamp
        select conversation_id, timestamp, max(message_id) message_id
        from Messages
        where message <> 'me'
        group by conversation_id, timestamp
    ) max_mid
    group by conversation_id
) max_mid_ts on max_mid_ts.message_id = m.message_id
order by m.message_id;
SELECT 
    m.message_timestamp, 
    m.message_id, 
    m.message_text,
    m.message_conversationId
FROM 
    ( SELECT message_conversationId         -- for every conversation
      FROM messages as m
      WHERE message_from <> 'me'            
      GROUP BY message_conversationId
    ) AS mc
  JOIN 
    messages AS m                           -- join to the messages
      ON  m.message_id =        
          ( SELECT mi.message_id            -- and find one message id
            FROM messages AS mi
            WHERE mi.message_conversationId      -- for that conversation
                  = mc.message_conversationId
              AND mi.message_from <> 'me'
            ORDER BY mi.message_timestamp DESC,  -- according to the
                     mi.message_id DESC          -- specified order
            LIMIT 1                              -- (this is the one part)
          ) ;