web-dev-qa-db-ja.com

1つのSQLクエリでアクティブユーザーの数を取得する方法

私は、ユーザーがクラシファイドを作成し、メッセージを作成/返信できるcraigslistに似たサイトを実行しています。アクティビティのアイデアを得るために、月あたりのアクティブユーザーの数を取得します。

アイデアは、アクティブユーザーを、過去30日以内に別のユーザーに登録、作成/編集、または分類または別のユーザーにメッセージを書いたユーザーとして定義することです。

2つのテーブルがあります。

  1. クラシファイド

    advertiser_id | date_created | date_edited
    
  2. メッセージ

    sender_user_id | recipient_user_id | timestamp | status
    

私はこのような出力を探しています:

year; month; n_active_users; n_users_created_classified; n_user_sent_msg; n_user_read_msg

メッセージはstatus=4によって既読としてマークされます

IDはすべてユーザーテーブルを参照しています。したがって、同じsender_user_idとadvertiser_idは同じユーザーを示します。

これが1つのクエリでさえ可能かどうかはわかりませんが、たぶんそれは可能だと思います。方法がわかりません。

別の投稿から、これが正しい方向を指している可能性があることを知りましたが、それでも私は行き詰まっています。

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  

MySQL Galera 5.6.27-1trusty-log-(Ubuntu)、wsrep_25.12を使用しています

3
merlin

テーブルをn_active_usersに変換する方法がわかりません。 n_users_created_classified; n_user_sent_msg; n_user_read_msg。しかし、ここにいくつかの手がかりがあります:

直前の30日間の簡単なクエリ:

SELECT COUNT(DISTINCT user_id)
    FROM tbl
    WHERE timestamp > NOW() - INTERVAL 1 MONTH;

(または、おそらくあなたは- INTERVAL 30 DAY。)

これは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;

毎月最後のものが必要な場合は、次のようにします。

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