3

我有一个数据库表,我可以在其中跟踪使用我的应用程序的人。每个用户每天可能有多次使用。因此,给定单个用户的示例记录集可能如下所示:

userId  dateOfUsage
1       2012-12-01
1       2012-12-02
1       2012-12-02
1       2012-12-03
1       2012-12-06
1       2012-12-07
1       2012-12-07
1       2012-12-08

假设今天是 2012-12-08。我想在三天或更长时间没有条目后获取今天和最后一条记录之间的天数。在上面的示例中,2012-12-03 和 2012-12-06 之间有一个休息时间,所以我想计算 2012-12-06 和今天(2012-12-08)之间的天数。答案将是 6 日至 8 日的“连续 3 天”。

是否可以仅在 MySQL 中执行此操作?如何为 MySQL 中的给定用户执行此操作?是否可以一次为所有用户执行此操作?

我发现了有关条纹的其他问题,但没有任何运气来调整它们来解决我的请求。谢谢!

4

2 回答 2

0

您可以使用带有游标的存储过程来创建临时表。

或者你可以做类似的事情

set @dateOfUsage = NULL;
SELECT * FROM (
  SELECT IF(@dateOfUsage IS NULL, 0, datediff(dateOfUsage, @dateOfUsage)) as gap, @dateOfUsage:=dateOfUsage AS dateOfUsage FROM (
    SELECT * FROM `usage` WHERE userID = 1 ORDER BY dateOfUsage
  ) `usage`
) `t` WHERE gap >= 3;

http://sqlfiddle.com/#!2/22228/2

请注意,您需要使用子查询,因为不保证表中行的顺序。

我需要另一个子查询来过滤(尽管我不明白为什么HAVING不这样做)。

于 2013-01-08T17:23:31.010 回答
0

如果您愿意,请过滤用户...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,userId  INT NOT NULL
,dateOfUsage DATE NOT NULL
);

INSERT INTO my_table (userid,dateofusage) VALUES
(1       ,'2012-12-01'),
(1       ,'2012-12-02'),
(1       ,'2012-12-02'),
(1       ,'2012-12-03'),
(2       ,'2012-12-04'),
(2       ,'2012-12-05'),
(1       ,'2012-12-06'),
(1       ,'2012-12-07'),
(1       ,'2012-12-07'),
(1       ,'2012-12-08');

SELECT DATEDIFF('2012-12-08',MAX(b.dateofusage))+1 streak  
  FROM ( SELECT x.*, COUNT(*) rank FROM my_table x JOIN my_table y ON y.userid = x.userid AND y.id <= x.id GROUP BY x.id) a
  JOIN ( SELECT x.*, COUNT(*) rank FROM my_table x JOIN my_table y ON y.userid = x.userid AND y.id <= x.id GROUP BY x.id) b
    ON b.dateofusage >= a.dateofusage + INTERVAL 3 DAY
   AND b.rank = a.rank + 1
   AND b.userid = a.userid
 GROUP
    BY a.userid;
于 2013-01-08T18:19:12.810 回答