Php 使用MySQL计算连续的日条纹

Php 使用MySQL计算连续的日条纹,php,mysql,database,mysql-5.7,Php,Mysql,Database,Mysql 5.7,我有下表: Date | isDone -------------------- 2018-10-01 | 1 2018-10-02 | 1 2018-10-03 | 1 2018-10-04 | 1 2018-10-10 | 0 2018-10-15 | 1 2018-10-16 | 0 2018-10-18 | 1 2018-10-19 | 1 2018-10-20 | 1 每天只能有一行,有两个可能的值0或1。一天不一定要吵架。如果一天内没有行,则该值被视为0 我想从当前日

我有下表:

Date       | isDone
--------------------
2018-10-01 | 1
2018-10-02 | 1
2018-10-03 | 1
2018-10-04 | 1 
2018-10-10 | 0
2018-10-15 | 1
2018-10-16 | 0
2018-10-18 | 1
2018-10-19 | 1
2018-10-20 | 1
每天只能有一行,有两个可能的值0或1。一天不一定要吵架。如果一天内没有行,则该值被视为0


我想从当前日期开始计算已完成任务的“当前条纹”(isDone列)。假设我们是2018-10-20,结果将是3。现在,我不想计算本月最大的连胜,在本例中为4(从2018-10-01到2018-10-04)。我想知道,直接用SQL(MySQL 5.7)或每天获取原始数据并用PHP计算streak,计算streak的最佳选择是什么?

您可以使用MySQL变量来计算streak。基本上,当
isDone
为1时,您需要在连续几天增加条纹,当
isDone
为0或日期不连续时,重置条纹。此查询将生成每天的条纹值:

SELECT s.Date,
       @streak := IF(Date = @last_date + INTERVAL 1 DAY AND isDone = 1, @streak+1, 1) AS streak,
       @last_date := Date AS last_date
FROM status s
JOIN (SELECT @streak := 0, @last_date := '1900-01-01') i
ORDER BY s.Date
输出:

Date        streak  last_date
2018-10-01  1       2018-10-01
2018-10-02  2       2018-10-02
2018-10-03  3       2018-10-03
2018-10-04  4       2018-10-04
2018-10-10  1       2018-10-10
2018-10-15  1       2018-10-15
2018-10-16  1       2018-10-16
2018-10-18  1       2018-10-18
2018-10-19  2       2018-10-19
2018-10-20  3       2018-10-20
Date        streak
2018-10-20  3
然后,您可以将其用作子查询,以确定给定日期的条纹

SELECT Date, streak
FROM (SELECT s.Date,
             @streak := IF(Date = @last_date + INTERVAL 1 DAY AND isDone = 1, @streak+1, 1) AS streak,
             @last_date := Date AS last_date
      FROM status s
      JOIN (SELECT @streak := 0, @last_date := '1900-01-01') i
      ORDER BY s.Date) s
WHERE s.Date = '2018-10-20'
输出:

Date        streak  last_date
2018-10-01  1       2018-10-01
2018-10-02  2       2018-10-02
2018-10-03  3       2018-10-03
2018-10-04  4       2018-10-04
2018-10-10  1       2018-10-10
2018-10-15  1       2018-10-15
2018-10-16  1       2018-10-16
2018-10-18  1       2018-10-18
2018-10-19  2       2018-10-19
2018-10-20  3       2018-10-20
Date        streak
2018-10-20  3

您可以使用MySQL变量来计算条纹。基本上,当
isDone
为1时,您需要在连续几天增加条纹,当
isDone
为0或日期不连续时,重置条纹。此查询将生成每天的条纹值:

SELECT s.Date,
       @streak := IF(Date = @last_date + INTERVAL 1 DAY AND isDone = 1, @streak+1, 1) AS streak,
       @last_date := Date AS last_date
FROM status s
JOIN (SELECT @streak := 0, @last_date := '1900-01-01') i
ORDER BY s.Date
输出:

Date        streak  last_date
2018-10-01  1       2018-10-01
2018-10-02  2       2018-10-02
2018-10-03  3       2018-10-03
2018-10-04  4       2018-10-04
2018-10-10  1       2018-10-10
2018-10-15  1       2018-10-15
2018-10-16  1       2018-10-16
2018-10-18  1       2018-10-18
2018-10-19  2       2018-10-19
2018-10-20  3       2018-10-20
Date        streak
2018-10-20  3
然后,您可以将其用作子查询,以确定给定日期的条纹

SELECT Date, streak
FROM (SELECT s.Date,
             @streak := IF(Date = @last_date + INTERVAL 1 DAY AND isDone = 1, @streak+1, 1) AS streak,
             @last_date := Date AS last_date
      FROM status s
      JOIN (SELECT @streak := 0, @last_date := '1900-01-01') i
      ORDER BY s.Date) s
WHERE s.Date = '2018-10-20'
输出:

Date        streak  last_date
2018-10-01  1       2018-10-01
2018-10-02  2       2018-10-02
2018-10-03  3       2018-10-03
2018-10-04  4       2018-10-04
2018-10-10  1       2018-10-10
2018-10-15  1       2018-10-15
2018-10-16  1       2018-10-16
2018-10-18  1       2018-10-18
2018-10-19  2       2018-10-19
2018-10-20  3       2018-10-20
Date        streak
2018-10-20  3

哪个MySQL版本?您希望2018-10-16的结果是什么?添加的版本@2018-10-16是一个“1”的单日连胜,因为15和17都被认为是0。但很明显,只有超过1天的连胜才有兴趣显示。添加了哪个MySQL版本?2018-10-16的预期结果是什么?版本@2018-10-16是一个“1”的单日连胜,因为15和17都被认为是0。但是很明显,只有超过1天的连胜才有兴趣展示。嗨@Nick,很好!我不知道@符号。我看到filddle正在使用MySQL 8,你认为5.7可以吗?我这周试试看。谢谢。:)符号@表示一个变量。5.7应该没问题,其中没有依赖于8的内容,这只是dbfiddleHi Nick上唯一的版本,它现在在tokeen.com上实现了;)我不知道为什么,但小提琴似乎不起作用了。(结果未显示)再次感谢您的帮助。@tokeen.com出于某种原因,MySQL目前没有在dbfiddle上工作。如果你把数据库改成MariaDB(兼容MySQL 5),然后按“run”键,它就可以正常工作了!我不知道@符号。我看到filddle正在使用MySQL 8,你认为5.7可以吗?我这周试试看。谢谢。:)符号@表示一个变量。5.7应该没问题,其中没有依赖于8的内容,这只是dbfiddleHi Nick上唯一的版本,它现在在tokeen.com上实现了;)我不知道为什么,但小提琴似乎不起作用了。(结果未显示)再次感谢您的帮助。@tokeen.com出于某种原因,MySQL目前没有在dbfiddle上工作。如果您将DB更改为MariaDB(兼容MySQL 5),然后按“run”,它就可以正常工作。