web-dev-qa-db-fra.com

Comment obtenir le nombre d'utilisateurs actifs avec une requête SQL?

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:

  1. petites annonces

    advertiser_id | date_created | date_edited
    
  2. 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

3
merlin

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);
3
Rick James