0

次のようなユーザーテーブルがあるとしましょう

userID int(4) unsigned not null auto_increment,
name varchar(50) not null,
date_start int(10) unsigned not null,
date_stop int(10) unsigned not null

月ごとにアクティブだったすべてのユーザー (date_start と date_stop の間、これらは unix_timestamps()) をカウントしたいと考えています。

したがって、結果は次のようになります。

2012/01    55
2012/02    58
2012/03    51

私はこのようなことを言いたいのですが、明らかに何かが欠けています:

SELECT 
    DATE_FORMAT(???, '%Y/%m'), 
    COUNT(userID) 
FROM users 
WHERE 
    ??? BETWEEN date_start AND date_stop 
GROUP BY DATE_FORMAT(???, '%Y%m');

...明確にするために、私にとってうまくいったのは:

SELECT m.yearMonth, COUNT(u.userID) 
FROM users u 
LEFT JOIN months m ON m.yearMonth BETWEEN DATE_FORMAT(FROM_UNIXTIME(u.date_start), '%Y%m') AND DATE_FORMAT(FROM_UNIXTIME(u.date_stop), '%Y%m') 
GROUP BY m.yearMonth;

「すべての」年/月が yyyymm の形式で格納されているテーブルを使用します。

4

3 に答える 3

1

yyyyMMまず、年、月の詳細をフォーマットで含むテーブルが必要です。次に、そのテーブルを users テーブルと結合する必要があります。yyyyMM の部分はdate_start、月テーブルの値より小さく、月テーブルの値date_end以上です。

これは、毎月 1 回、1 か月以上アクティブだったユーザーをカウントします。

CREATE TABLE months(yearMonth INT);
INSERT INTO months VALUES(201201);
INSERT INTO months VALUES(201202);
INSERT INTO months VALUES(201203);
....

SELECT m.yearMonth, COUNT(*) 
FROM 
    months m, users u
WHERE
    m.yearMonth >= CONVERT(INT, 
                        CONVERT(VARCHAR(4), DATEPART(yy, date_start) + 
                        CONVERT(VARCHAR(2), DATEPART(mm, date_start)
                      )
AND m.yearMonth <= CONVERT(INT, 
                        CONVERT(VARCHAR(4), DATEPART(yy, date_end) + 
                        CONVERT(VARCHAR(2), DATEPART(mm, date_end)
                      )

注: これは SQL Server ですが、CONVERT/DATEPART 関数に対応する MySQL を取得できるはずです。

于 2012-12-20T11:37:12.657 に答える
0

このためのテーブルとトリガーを作成できます。active_user が追加された場所では、テーブルの値をインクリメントする必要があります。ユーザー出口デクリメント。このステップ数の後、ユーザーの数は表の現在の値になります。

この方法で時間を節約できます(「間」は大きなテーブルの軽量操作ではないため(およびフィールドdate_startにインデックスがない場合))。

于 2012-12-21T10:01:55.707 に答える
0

そのようなことを試してください

    SELECT DATE_FORMAT(???, '%Y/%m') , userID 
     FROM users 
     WHERE ??? BETWEEN '2012/01' AND '2012/05' 
     GROUP BY DATE_FORMAT(???, '%Y%m');

あなたは正しかったcount(userID)

編集:

データベースに 1 つの列がありません。ユーザーがlast_active_dateログインすると、この日付が更新last_active_dateされ、その日付に彼がアクティブだったことがわかります。

あなたのSQLでは、それらがアクティブであること、またはいつログインしたかを知ることができませんか? この列がある場合、SQLでそのようになります

 WHERE last_active_date BETWEEN '2012/01' AND '2012/05' 
于 2012-12-20T11:27:10.147 に答える