首页 > 解决方案 > 按发送时间分组消息

问题描述

我正在两个用户之间开发一个消息系统,我想在发送时对它们进行分组,只显示一次。

目前,我显示消息和每条消息的发送时间,但我只想显示对话中对它们进行分组的最后一条消息(就像 Twitter 的直接消息一样)。

SELECT id, author, datetime, text FROM messages WHERE author = 'A' AND receiver = 'B'

我有什么(id/作者/日期时间/文本):

1 / A / 22/03/2019 22:15 / This is message 1
--------------------------------------------
2 / A / 22/03/2019 22:16 / This is message 2
--------------------------------------------
3 / B / 22/03/2019 22:16 / This is message 3
--------------------------------------------
4 / A / 22/03/2019 22:16 / This is message 4
--------------------------------------------
5 / A / 22/03/2019 22:16 / This is message 5
--------------------------------------------
6 / A / 22/03/2019 22:18 / This is message 6
--------------------------------------------
7 / B / 22/03/2019 22:19 / This is message 7

我想要什么(id / author / datetime / text):

1 / A / 22/03/2019 22:15 / This is message 1
--------------------------------------------
2 / A / 22/03/2019 22:16 / This is message 2
--------------------------------------------
3 / B / 22/03/2019 22:16 / This is message 3
--------------------------------------------
4 / A / 22/03/2019 22:16 / This is message 4
5 / A / 22/03/2019 22:16 / This is message 5
--------------------------------------------
6 / A / 22/03/2019 22:18 / This is message 6
--------------------------------------------
7 / B / 22/03/2019 22:19 / This is message 7

消息 4 和 5 已被分组,因为它们属于同一用户并在同一分钟内发送。

当当前日期不等于发送消息的日期时,我想按天对消息进行分组。换句话说,当前日期未发送的消息将被组合在一起。在这种情况下,消息的用户将不被考虑在内,所有消息都将仅按日期分组。

标签: phpmysqligroup-by

解决方案


您无需对查询进行任何更改即可获得该结果,只需更改获取行的方式即可。

使用作者和日期时间值创建一个复合键,将您的消息分成组。您还可以获取日期时间的日期部分以将消息组分隔为天。

while ($row = $query->fetch_assoc()) {

    // get the date
    $date = substr($row['datetime'], 0, 10);

    // create the composite key
    $key = "$row[author]$row[datetime]";

    // group the messages
    $message_groups[$date][$key][] = $row;
}

我还建议为您的查询指定一个 ORDER BY,可能是ORDER BY id. MySQL 不一定会按照插入的顺序自动返回它们。


推荐阅读