Ceci est une version SQL du rapport de tableau de bord pour les messages privés entre utilisateurs (avec réponses) et entre utilisateurs (sans réponses).
Ce rapport compte le nombre de messages privés envoyés par les utilisateurs chaque jour, dans une plage de dates spécifiée, fournissant un aperçu de l’activité d’engagement des utilisateurs dans la communication privée.
--[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
Explication de la requête SQL
Cette requête SQL effectue les actions suivantes :
- Paramètres :
:start_dateet:end_date, qui sont utilisés pour filtrer les données dans la plage de dates spécifiée. Les deux paramètres de date acceptent le formatAAAA-MM-JJ.:include_repliespour déterminer si les réponses aux messages initiaux doivent être incluses dans le décompte. Défini surfalsepar défaut pour refléter le comportement du rapport Utilisateur à Utilisateur (sans réponses). La définition de ce paramètre surtruereflétera le comportement du rapport Utilisateur à Utilisateur (avec réponses).
- Sélection des données :
- La requête sélectionne la date
created_atde la tableposts, qui représente la date de création de chaque message.
- La requête sélectionne la date
- Opération de jointure :
- La requête effectue une jointure
INNER JOINentre les tablespostsettopicssur leurs champsid. Cette jointure est cruciale car elle relie chaque publication à son sujet correspondant, nous permettant de filtrer uniquement les publications qui font partie d’une conversation de message privé.
- La requête effectue une jointure
- Critères de filtrage : La requête applique plusieurs filtres :
- Elle ne prend en compte que les publications qui font partie d’un sujet avec un
archetypede ‘private_message’, garantissant que seuls les messages privés sont comptés. - Elle exclut toutes les publications qui ne sont pas associées à un utilisateur en s’assurant que
user_idest supérieur à 0. - Elle affine davantage les résultats pour les sujets avec un
subtypede ‘user_to_user’, ce qui indique un message privé entre utilisateurs individuels. - Elle exclut toutes les publications ou sujets qui ont été supprimés en vérifiant que
deleted_atest NULL pour les deux tables. - Elle applique le filtre de plage de dates pour inclure uniquement les publications créées entre
:start_dateet:end_date. - Si
:include_repliesest false, seule la première publication de chaque sujet est comptée (p.post_number = 1), excluant les réponses.
- Elle ne prend en compte que les publications qui font partie d’un sujet avec un
- Agrégation : La requête regroupe les résultats par la date de création des publications, ce qui permet de compter le nombre de messages envoyés chaque jour.
- Tri : Enfin, la requête trie les résultats par date dans l’ordre croissant, fournissant une séquence chronologique de l’activité des messages privés entre utilisateurs.
Résultats d’exemple
| jour | personal_messages |
|---|---|
| 2023-11-11 | 92 |
| 2023-11-12 | 57 |
| 2023-11-13 | 345 |
| 2023-11-14 | 124 |
| 2023-11-15 | 56 |