假设我有一个像这样的表(MySQL):
CREATE TABLE sessions (
session_id INT NOT NULL AUTO_INCREMENT,
name CHAR(12),
start INT,
end INT,
PRIMARY KEY (session_id)
)
跟踪登录到应用程序的用户。每个用户登录在此表中创建一个条目,设置开始时间(作为从Unix纪元开始计算秒数的整数),并且注销更新此表,同样地设置结束时间。我的问题是在一个时间范围内(通常是一天)以五分钟为间隔查找登录用户的数量。
到目前为止,我所做的是编写一个循环数据的过程。
SET t = begin_time;
WHILE t <= end_time DO
SELECT t, COUNT(1) FROM TABLE WHERE start <= t AND end >= t;
SET t = t + 300;
END WHILE;
这非常耗时;我正在为这个问题寻找替代解决方案。 Web引用,指针 - 任何帮助都可以。
提前致谢。
答案 0 :(得分:0)
SELECT (end-start)-(end-start)%300, COUNT(1) FROM session GROUP BY 1 ORDER BY 1;
答案 1 :(得分:0)
我认为,你需要数字表的帮助,根据给定的时间范围和时间点之间的间隔,对每个时间点进行适当的分析。
这是一个可能的解决方案:
SET begin_time = ...
SET end_time = ...
SET interval_sec = 300;
CREATE TEMPORARY TABLE timestamps (unixtime int);
SET t = (begin_time + interval_sec - 1) div interval_sec;
WHILE t <= end_time DO
INSERT INTO timestamps (unixtime) VALUES (t);
SET t = t + interval_sec;
END WHILE;
SELECT
t.unixtime,
COUNT(s.session_id)
FROM timestamps t
LEFT JOIN sessions s ON t.unixtime >= s.start AND t.unixtime < s.end;
GROUP BY t.unixtime
第3行确保根据时钟刻度,所有被分析的时间戳都是5分钟间隔的开始。如果您希望它们基于指定时间范围的开头,请将其更改为SET t = begin_time;
。
此解决方案会在指定时刻计算活动会话数。如果用户可以拥有多个并发会话,并且您想知道有多少不同的用户在线,则应将COUNT(s.session_id)
替换为COUNT(DISTINCT s.name)
。