在mariadb中进行咨询,获取每个用户的最新消息

时间:2019-06-18 17:54:14

标签: mysql group-by mariadb greatest-n-per-group groupwise-maximum

我正在聊天,我需要对我的数据库进行查询,在该数据库中,我要携带用户从与他写信的每个人处收到的最后一条消息,该查询应基于日期,最后一条消息应基于到日期为止

表格如下

# I can get all iris data from postresql database to R with no problem
test <- dbGetQuery(con, 'SELECT * from iris') 

# Here I run into an error
test1 <- dbGetQuery(conSac, 'SELECT * from 20190502')

我需要执行后查询将以以下方式显示给我:

id   id_destination   message   sender     date
1          1123          hi      1133    18/06/2019
2          1123          bye     1133    17/06/2019
3          1123          ok      1144    18/06/2019
4          1123          hi      1144    17/06/2019

2 个答案:

答案 0 :(得分:0)

尝试使用density_rank()

slect * from 
(select *,dense_rank()over(partition by id_destination order by date desc) rn
from table
) a where rn=1

答案 1 :(得分:0)

使用此子查询查找每个目的地和发件人具有最高ID的邮件。

                          SELECT MAX(id) id
                            FROM messages
                        GROUP BY id_destination, sender

然后使用它来选择消息,例如:(https://www.db-fiddle.com/f/9W7YTSN8Dq7TuRYnL1jmXE/0

   SELECT *
     FROM messages
    WHERE id IN (
                          SELECT MAX(id) id
                            FROM messages
                        GROUP BY id_destination, sender
                )

您可以为此添加AND sender = something或任何其他过滤器。

假定每个新消息都有一个自动递增的ID值,因此以后的消息比以前的消息具有更高的ID值。

使用日期比较棘手,但速度慢得多。 (https://www.db-fiddle.com/f/6MKc7At6MKPm98eUEPKMYz/0)。如果在最近的日期出现多条消息,它也可能存在歧义。

SELECT * 
FROM messages m
JOIN (
                      SELECT MAX(date) date, id_destination, sender
                        FROM messages
                    GROUP BY id_destination, sender
     ) x ON m.date=x.date 
        AND m.id_destination = x.id_destination
        AND m.sender = x.sender