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格式的年、月详细信息。然后,您需要将该表与用户表连接起来,其中 yyyyMM 部分date_start小于月份表中的值且date_end大于或等于月份表中的值。

这将计算一个活跃超过一个月的用户,每月一次,我认为这是您所期望的。

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

尝试类似的东西

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

你是对的只是不要使用count(userID)

编辑:

您的数据库中缺少一列。应该是last_active_date这样,当用户登录时,它将更新此日期,last_active_date并且您知道他在该日期处于活动状态。

现在在你的 sql 中,你不知道他们是活跃的还是他们什么时候登录的?如果您将拥有此列,它将与您的 sql 中的一样

 WHERE last_active_date BETWEEN '2012/01' AND '2012/05' 
于 2012-12-20T11:27:10.147 回答
0

您可以为此创建表和触发器。在添加 active_user 的地方,您必须增加表中的值。关于用户退出减量。在此步骤之后,用户的计数将是表中的当前值。

这样可以节省您的时间(因为“介于”不是大表的精简操作(并且如果您在字段 date_start 上没有索引))。

于 2012-12-21T10:01:55.707 回答