我有一个用于虚构健身应用程序的MySQL表。 让我们说应用程序正在监控用户每天进行俯卧撑的进度。
TrainingDays
id | id_user | date | number_of_pushups
现在,我需要找出用户是否连续5天设法做了超过100次俯卧撑。
我知道这可能是通过获取所有日子然后制作一些php循环来实现的,但我想知道是否有可能在普通的mysql中执行此操作...
答案 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