MySQL 选择日连续

Lol*_*ums 3 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
Run Code Online (Sandbox Code Playgroud)

我想检索用户的当前连胜1。预期结果是3如果今天的日期是2012-12-03

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

如果他们有 4 条记录,则他们的连续记录为 4。如果他们有 2 条记录,则他们的连续记录为 2。如果他们的最后记录超过 24 小时前,则他们的连续记录为 0。

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

改写

“连续”被定义为具有给定 的条目的连续天数 ( ) 。TimestampUserId

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

Gio*_*sos 6

您可以使用以下查询:

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
Run Code Online (Sandbox Code Playgroud)

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

请注意 被@days_diff初始化为 ,-1以便如果最先处理的最后一条记录超过 24 小时前,则 streak 被设置为。0

演示在这里