我有一个包含两列的MySQL表:takenOn(datetime)和count(int)。 count包含我已采取的步骤数。

我正在尝试编写一个查询,告诉我每天达到10,000个步骤的目标的时间。

到目前为止,我有以下查询:

SET @runningTotal=0;
SELECT
    `Date`,
    DATE_FORMAT(MIN(takenOn), '%l:%i %p') AS `Time`,
    TotalCount
FROM
    (SELECT
        DATE(s.takenOn) AS `Date`,
        s.takenOn,
        s.`count`,
        @runningTotal := @runningTotal + s.`count` AS TotalCount
    FROM
    (select * from step where DATE(takenOn) = '2016-10-29') s) temp
WHERE TotalCount >= 10000;


这可行,但是当然只给我10月29日的MIN(takenOn)。如何扩展此查询以为表中所有可能的日期提供MIN(takenOn)

谢谢!

最佳答案

我假设您关心的步骤都在一天之内。您走在正确的轨道上。这是多天的代码:

SELECT `Date`, DATE_FORMAT(MIN(takenOn), '%l:%i %p') AS `Time`,
       MIN(TotalCount)
FROM (SELECT DATE(s.takenOn) AS `Date`,
             s.takenOn,
             s.`count`,
             (@runningTotal := if(@d = DATE(s.takenOn), @runningTotal + s.`count`,
                                  if(@d := DATE(s.takeOn), s.`count`, s.`count`)
                                  )
             ) AS TotalCount
      FROM step s CROSS JOIN
           (SELECT @runningTotal := 0, @d = '') params
      ORDER BY takenOn
     ) s
WHERE TotalCount >= 10000
GROUP BY `Date`;


请注意,所有变量分配都在一个表达式中。这很重要,因为MySQL不保证SELECT中表达式的求值顺序。因此,如果您将分配分配给一个以上的表达式,则不能保证代码可以正常工作。

09-07 05:14