我在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上描述了类似的问题,但是我没有发现任何真正起作用的东西。
答案 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;