Mysql在一段时间内计算行数

时间:2012-12-20 11:16:45

标签: mysql select period

假设我有一个类似于

的用户表
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形式存储“全部”年/月的表格。

3 个答案:

答案 0 :(得分:1)

首先,您应该有一个包含yyyyMM格式的年,月详细信息的表。然后,您需要将该表与users表连接,其中yyyyMM部分date_start小于months表中的值,date_end大于或等于months表中的值。

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

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版本。

答案 1 :(得分: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' 

答案 2 :(得分:0)

您可以为此创建表格和触发器。 如果添加了active_user,则必须在表中增加值。在用户退出减少。 在这一步之后 用户数将是表中的当前值。

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