私は、ユーザーがクラシファイドを作成し、メッセージを作成/返信できるcraigslistに似たサイトを実行しています。アクティビティのアイデアを得るために、月あたりのアクティブユーザーの数を取得します。
アイデアは、アクティブユーザーを、過去30日以内に別のユーザーに登録、作成/編集、または分類または別のユーザーにメッセージを書いたユーザーとして定義することです。
2つのテーブルがあります。
クラシファイド
advertiser_id | date_created | date_edited
メッセージ
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を使用しています
テーブルを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);