此问题类似于此处回答的问题: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
。
答案 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
。