选择每个用户的最后一封邮件

时间:2018-07-20 12:24:33

标签: sqlite select android-sqlite

我在android中有一个SQLite表,其中包含以下消息:

@primarykey
long id;
String from;
String to;
long timestamp;
String body;

此表中所有我和其他用户之间的消息都是一对一聊天。 我需要一个选择,该选择将返回我和每个用户之间的最后一条消息。 我知道如何将所有地址都与地址分开,将它们合并并分别为每个地址选择最后一条消息,但是我需要更好的方法-不要一步一步完成

    @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
    @Query("SELECT DISTINCT `from`, `to` FROM Message")
    LiveData<List<ChatHelper>> getDinstinctChats();

    @Query("SELECT * FROM Message where `from` LIKE :address OR `to` LIKE :address ORDER BY `timestamp` LIMIT 1")
    LiveData<List<ChatMessage>> getLastMessageWith(String address);

stackoverflow上描述了类似的问题,但是我没有发现任何真正起作用的东西。

1 个答案:

答案 0 :(得分:0)

首先,获取我和其他用户之间的所有消息,并对列进行重新排序,以便其他用户始终位于固定列中:

SELECT id, `from` AS other, timestamp, body
FROM Message
WHERE `to` LIKE :address
UNION ALL
SELECT id, `to`   AS other, timestamp, body
FROM Message
WHERE `from` LIKE :address;

然后通过“其他”列进行分组,以使每个用户获得一个结果行:

SELECT *, max(timestamp)
FROM (SELECT id, `from` AS other, timestamp, body
      FROM Message
      WHERE `to` LIKE :address
      UNION ALL
      SELECT id, `to`   AS other, timestamp, body
      FROM Message
      WHERE `from` LIKE :address)
GROUP BY other;