我正在开发两个用户之间的消息系统,我想按发送时间将它们分组,只显示一次。
当前,我显示消息和每条消息的发送时间,但我只想显示对话中将它们分组的最后一条消息(与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 /作者/日期时间/文字):
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已归为一组,因为它们属于同一用户并在同一分钟内发送。
当当前日期不等于发送消息的日期时,我想按天数对消息进行分组。换句话说,在当前日期未发送的消息将被分组在一起。在这种情况下,不会考虑邮件的用户,并且只会按日期对所有邮件进行分组。
答案 0 :(得分:0)
您无需为获取该结果而对查询进行任何更改,只需更改获取行的方式即可。
使用author和datetime值创建一个组合键,以将您的消息分为几组。您还可以获取日期时间的日期部分,以将消息组划分为几天。
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不一定会按照插入顺序自动返回它们。