假设我有一个类似于
的用户表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形式存储“全部”年/月的表格。
答案 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那样
WHERE last_active_date BETWEEN '2012/01' AND '2012/05'
答案 2 :(得分:0)
您可以为此创建表格和触发器。 如果添加了active_user,则必须在表中增加值。在用户退出减少。 在这一步之后 用户数将是表中的当前值。
这样可以节省你的时间(因为“between”不是大表的精简操作(如果你没有字段date_start上的索引))。