Это SQL-версия отчёта «Дашборд» для сообщений «от пользователя к пользователю» (с ответами) и «от пользователя к пользователю» (без учёта ответов).
Данный отчёт подсчитывает количество личных сообщений, отправленных пользователями каждый день в заданном диапазоне дат, предоставляя представление об активности пользователей в частной коммуникации.
--[params]
-- date :start_date = 2024-01-06
-- date :end_date = 2024-02-07
-- boolean :include_replies = false
SELECT
p.created_at::date as day,
COUNT(p.user_id) as personal_messages
FROM posts p
INNER JOIN topics t ON (p.topic_id = t.id)
WHERE archetype = 'private_message'
AND p.user_id > 0
AND t.subtype = 'user_to_user'
AND p.deleted_at ISNULL
AND t.deleted_at ISNULL
AND p.created_at::date BETWEEN :start_date AND :end_date
AND (:include_replies = true OR p.post_number = 1)
GROUP BY p.created_at::date
ORDER BY p.created_at::date
Объяснение SQL-запроса
Этот SQL-запрос выполняет следующие действия:
- Параметры:
:start_dateи:end_date— используются для фильтрации данных в заданном диапазоне дат. Оба параметра даты принимают форматYYYY-MM-DD.:include_replies— определяет, следует ли включать в подсчёт ответы на исходные сообщения. По умолчанию установлено вfalse, чтобы воспроизвести поведение отчёта «от пользователя к пользователю» (без учёта ответов). Установка этого параметра вtrueвоспроизведёт поведение отчёта «от пользователя к пользователю» (с ответами).
- Выборка данных:
- Запрос выбирает дату
created_atиз таблицыposts, которая представляет дату создания каждого сообщения.
- Запрос выбирает дату
- Операция соединения:
- Запрос выполняет внутреннее соединение (INNER JOIN) таблиц
postsиtopicsпо их полямid. Это соединение критически важно, так как оно связывает каждое сообщение с соответствующей темой, позволяя отфильтровать только те сообщения, которые являются частью диалога личных сообщений.
- Запрос выполняет внутреннее соединение (INNER JOIN) таблиц
- Критерии фильтрации: Запрос применяет несколько фильтров:
- Учитываются только сообщения, входящие в тему с
archetypeравнымprivate_message, что гарантирует подсчёт только личных сообщений. - Исключаются сообщения, не связанные с пользователем, путём проверки, что
user_idбольше 0. - Результаты дополнительно ограничиваются темами с
subtypeравнымuser_to_user, что указывает на личное сообщение между отдельными пользователями. - Исключаются любые сообщения или темы, которые были удалены, путём проверки, что
deleted_atравно NULL для обеих таблиц. - Применяется фильтр по диапазону дат, чтобы включить только сообщения, созданные между
:start_dateи:end_date. - Если
:include_repliesравноfalse, учитывается только первое сообщение в каждой теме (p.post_number = 1), что исключает ответы.
- Учитываются только сообщения, входящие в тему с
- Агрегация: Запрос группирует результаты по дате создания сообщений, что позволяет подсчитать количество сообщений, отправленных в каждый день.
- Сортировка: Наконец, запрос сортирует результаты по дате в порядке возрастания, предоставляя хронологическую последовательность активности личных сообщений «от пользователя к пользователю».
Пример результатов
| day | personal_messages |
|---|---|
| 2023-11-11 | 92 |
| 2023-11-12 | 57 |
| 2023-11-13 | 345 |
| 2023-11-14 | 124 |
| 2023-11-15 | 56 |