我需要找到匹配where子句的任何5行,它们“连续”出现(它们是邻居)

时间:2014-10-10 19:30:17

标签: mysql

我有一个用于虚构健身应用程序的MySQL表。 让我们说应用程序正在监控用户每天进行俯卧撑的进度。

TrainingDays

id  | id_user  |  date  |  number_of_pushups

现在,我需要找出用户是否连续5天设法做了超过100次俯卧撑。

我知道这可能是通过获取所有日子然后制作一些php循环来实现的,但我想知道是否有可能在普通的mysql中执行此操作...

2 个答案:

答案 0 :(得分:2)

在MySQL中,最简单的方法是使用变量。以下内容获得100或更多俯卧撑的所有日期序列:

select grp, count(*) as numdaysinarow
from (select (date - interval rn day) as grp, td.*
      from (select td.*,
                   (@rn := if(@i = id_user, @rn + 1
                              if(@i := id_user, 1, 1)
                             ) as rn
            from trainingdays td cross join
                 (select @rn := 0, @i := NULL) vars
            where number_of_pushups >= 100
            order by id_user, date
           ) td
     ) td
group by grp;

这使用的观察结果是,当您从一系列递增的日期中减去一系列数字时,结果值将保持不变。

要确定连续5天或更多天,请使用max()

select max(numdaysinarow)
from (select grp, count(*) as numdaysinarow
      from (select (date - interval rn day) as grp, td.*
            from (select td.*,
                         (@rn := if(@i = id_user, @rn + 1
                                    if(@i := id_user, 1, 1)
                                   ) as rn
                  from trainingdays td cross join
                       (select @rn := 0, @i := NULL) vars
                  where number_of_pushups >= 100
                  order by id_user, date
                 ) td
           ) td
      group by grp
     ) td;

您的应用可以根据您喜欢的最低价格检查价值。

注意:这假设每天只有一条记录。如果您正在寻找每天俯卧撑次数的总和,则可以轻松修改上述内容。

答案 1 :(得分:-1)

不应依赖记录顺序,例如使用ORDER BY,您可以更改序列。

但是,您在数据库中拥有许多功能,这也使您能够use less PHP。你想要的是SUM功能。结合WHERE子句,这应该让你开始:

SELECT SUM(number_of_pushups) AS sum_pushups
FROM TrainingDays
WHERE date >= :start_day
AND user_id = :user_id