MySQL Select Day Streak

时间:2016-02-07 18:10:11

标签: mysql

此问题类似于此处回答的问题:http://sqlfiddle.com/#!2/929846/1/0

Id    UserId  Timestamp
1     1       2012-12-01
2     2       2012-12-02
3     1       2012-12-02
4     2       2012-12-02
5     1       2012-12-03
6     3       2012-12-02
7     2       2012-12-03
8     3       2012-12-03

我想检索用户1的当前条纹。如果今天的日期为3,则预期结果为2012-12-03

用户在24小时的同一空间内永远不会有多个条目。

如果他们有4条记录,则他们的连胜数为4.如果他们有2条记录,则他们的连胜数为2.如果他们的最后一条记录超过24小时,则他们的连胜数为0.

如何仅使用MySQL查询计算条纹?

改写

A"连胜"定义为具有给定Timestamp条目的连续天数(UserId)。

需要帮助编写sql(或者可能是存储函数),给定UserId和结尾Timestamp,返回streak

1 个答案:

答案 0 :(得分:3)

您可以使用以下查询:

SELECT MAX(streak) AS streak
FROM (
  SELECT Id, UserId, `Timestamp`,
         DATEDIFF(NOW(), `Timestamp`),
         @streak := IF( DATEDIFF(NOW(), `Timestamp`) - @days_diff > 1, @streak, 
                       IF(@days_diff := DATEDIFF(NOW(), `Timestamp`), @streak+1, @streak+1))  AS streak                                        
  FROM mytable
  CROSS JOIN (SELECT @streak := 0, @days_diff := -1) AS vars
  WHERE UserId = 1 AND `Timestamp` <= NOW()
  ORDER BY `Timestamp` DESC) AS t

查询使用@streak变量逐步更新条纹数。只要两个连续记录之间没有大于一天的间隙,变量就会不断增加。

请注意,@days_diff已初始化为-1,因此,如果最后记录(首先处理 )超过24小时前,条纹设置为0

Demo here