Группировать сообщения по времени отправки

Я разрабатываю систему сообщений между двумя пользователями и хочу сгруппировать их по времени отправки, показывая только один раз.

В настоящее время я показываю сообщения и время отправки каждого из сообщений, но я хочу показать только последнее сообщение, сгруппировав их в беседе (как это происходит с прямыми сообщениями 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 были сгруппированы, поскольку они принадлежат одному пользователю и отправлены в одну и ту же минуту.

Я хотел бы группировать сообщения по дням, когда текущая дата не равна дате отправки сообщений. Другими словами, сообщения, которые не были отправлены в текущую дату, будут сгруппированы вместе. В этом случае не учитывался бы пользователь сообщения и все группировалось бы только по дате.


person Gabri    schedule 22.03.2019    source источник


Ответы (1)


Вам не нужно ничего менять в своем запросе, чтобы получить этот результат, вы можете просто изменить способ выборки строк.

Используйте значения 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 не обязательно автоматически возвращает их в том порядке, в котором они были вставлены.

person Don't Panic    schedule 22.03.2019