我正在构建一个聊天应用程序,其中使用Firebase发送和接收消息。一旦发送或接收消息,就将其存储到SQLite,如下所示。现在是最近的聊天屏幕,我需要所有唯一聊天中的最后一条消息(所有SentTo和SentBy对之间的所有消息,即Mid A&B属于一个唯一的聊天),按sendTime,那些唯一的未读消息数进行排序当我观察SQLite数据库时,在一个查询中聊天。
Mid(STRING) | SentBy | SentT0 | message | readTime | sentTime| Type
----------------+--------+--------+---------+----------+---------+------
A | AA | JD | M1 | 1 | 0 | S
B | JD | AA | M2 | 2 | 1 | s
C | AA | JD | M3 | 3 | 2 | s
D | AB | JD | m5 | null | 3 | s
E | AA | JC | M1 | 5 | 4 | s
F | JD | AB | M2 | 6 | 5 | s
G | AA | JD | M3 | 7 | 6 | s
H | AA | JC | m5 | 8 | 7 | s
I | AA | JD | M1 | null | 8 | s
J | JD | AA | M2 | 10 | 9 | s
K | AA | JD | M3 | 11 | 10 | s
L | AB | JC | m5 | 12 | 11 | s
M | AA | JD | M1 | 13 | 12 | s
N | JC | AA | M2 | 14 | 13 | s
O | AB | JD | M3 | 15 | 14 | s
P | JC | JD | m5 | 16 | 15 | s
我尝试过
'SELECT * , COUNT (*)from $messagesListTableName as C GROUP BY $columnSentBy , $columnSentTo '
这给了我最后的消息和唯一对的数量,但是没有通过对话将它们分组。因此,每对我都有两个最新消息。我可以稍后将它们分组,但是我没有收到看不见的邮件计数。
答案 0 :(得分:1)
如果一对唯一的聊天是由sentBy
/ sentTo
对定义的(不考虑顺序),那么在最新版本的SQLite中,您可以使用窗口函数:
select t.*
from (select t.*,
row_number() over (partition by min(sentBy, sentTo), max(sentBy, sentTo) order by senttime desc) as seqnum,
sum(case when readtime is null then 1 else 0 end) over (partition by min(sentBy, sentTo), max(sentBy, sentTo)) as num_unreads
from t
) t
where seqnum = 1;