如何从一个查询中获取多个值

时间:2019-01-30 14:45:02

标签: sql sqlite

我正在构建一个聊天应用程序,其中使用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 ' 

这给了我最后的消息和唯一对的数量,但是没有通过对话将它们分组。因此,每对我都有两个最新消息。我可以稍后将它们分组,但是我没有收到看不见的邮件计数。

1 个答案:

答案 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;