Je gère un site similaire à Craigslist où les utilisateurs peuvent créer des classifications et des messages d'écriture/réponse. Pour avoir une idée d'activité, j'aimerais obtenir la quantité d'utilisateurs actifs par mois.
L'idée est de définir un utilisateur actif en tant que celui qui a enregistré, créé/édité un message classifié ou écrit à un autre utilisateur au cours des 30 derniers jours.
Il y a 2 tables:
petites annonces
advertiser_id | date_created | date_edited
messages
sender_user_id | recipient_user_id | timestamp | status
Je cherche une sortie comme celle-ci:
year; month; n_active_users; n_users_created_classified; n_user_sent_msg; n_user_read_msg
Un message est marqué comme lu par status=4
Les identifiants se réfèrent tous à la table d'utilisateurs. Donc, le même sender_user_id et annonceur indiquent le même utilisateur.
Je ne suis pas sûr que cela soit même possible avec une seule question mais je suppose que c'est que je ne sais tout simplement pas comment.
D'un autre poste, j'ai appris que cela pourrait être pointé dans la bonne direction, mais je suis toujours bloqué:
SELECT
EXTRACT(YEAR FROM date_created) AS yr, -- for each year
EXTRACT(MONTH FROM date_created) AS mth, -- & month combination
count(*) AS advertiser_id
FROM
classifieds c
GROUP BY yr, mth
ORDER BY yr DESC , mth DESC
J'utilise MySQL Galera 5.6.27-1trusty-journal - (Ubuntu), WSREP_25.12
Je ne sais pas comment traduire vos tables en n_active_utilisateurs; n_USERS_CREATED_CLASSIDED; n_user_sent_msg; n_user_read_msg. Mais voici quelques indices:
Une simple requête pour les 30 jours précédents:
SELECT COUNT(DISTINCT user_id)
FROM tbl
WHERE timestamp > NOW() - INTERVAL 1 MONTH;
(Ou peut-être que vous voudriez - INTERVAL 30 DAY
.)
Cela pourrait fonctionner pour n_user_read_msg:
SELECT COUNT(DISTINCT recipient_user_id) AS n_user_read_msg
FROM messages
WHERE timestamp > NOW() - INTERVAL 1 MONTH;
AND status = 4;
Si vous voulez la dernière chose pour chaque mois, alors faites:
SELECT LEFT(timestamp, 7) AS yyyy_mm,
COUNT(DISTINCT recipient_user_id) AS n_user_read_msg
FROM messages
WHERE status = 4
GROUP BY LEFT(timestamp, 7);