这个问题与这里回答的问题类似: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.
您可以使用以下查询:
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