使用包含给定值的开始和结束字段计数记录

时间:2011-03-03 03:29:02

标签: mysql sql

假设我有一个像这样的表(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引用,指针 - 任何帮助都可以。

提前致谢。

2 个答案:

答案 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)