Php 数据范围内的MySQL计数周期 我的MySQL表被一个电位计(硬件)填满。 随着传感器值的变化,数据被添加到MySQL表中名为Pot的列中。 Pot是一列,其中包含随着时间的推移从电位计读取的值。 此列中的值范围为760到1007。 此列中的值不能立即从760跳到1007,它必须是连续的。

Php 数据范围内的MySQL计数周期 我的MySQL表被一个电位计(硬件)填满。 随着传感器值的变化,数据被添加到MySQL表中名为Pot的列中。 Pot是一列,其中包含随着时间的推移从电位计读取的值。 此列中的值范围为760到1007。 此列中的值不能立即从760跳到1007,它必须是连续的。,php,mysql,sql,Php,Mysql,Sql,这张桌子是这样的: ***Pot*** Time 1s -> 1007 Time 2s -> 987 Time 3s -> 909 Time 4s -> 887 time 5s -> 779 Time 6s -> 775 Time 7s -> 767 Time 8s -> 1004 Time 9s -> 1004 Time 10s -> 1004 Time 11s -> 1001 Time 12s -> 987 Ti

这张桌子是这样的:

    ***Pot***
Time 1s -> 1007
Time 2s -> 987
Time 3s -> 909
Time 4s -> 887
time 5s -> 779
Time 6s -> 775
Time 7s -> 767
Time 8s -> 1004
Time 9s -> 1004
Time 10s -> 1004
Time 11s -> 1001
Time 12s -> 987
Time 13s -> 899
我添加的时间箭头显示,在时间1秒,硬件添加一个值,时间2秒,987被添加……在实验开始后7秒,767被添加

一旦达到下限值,传感器开始输入接近上限的值,如1007等。从高值开始,传感器开始再次向下限输入值。可能存在重复项,但正如您所看到的,随着时间的推移,会输入行

我想做的是找出传感器值从上限到下限的变化次数

因此,在这种情况下,循环数的输出将是1,而不是2,因为值尚未达到760,因此被视为2个循环

select count(*)
from (select cycle, min(BBQ_Chicken) as minpot, maxpot as maxpot
      from (select *,
                   @cycle = if(pot >= 1000 and @state = 'bottom',
                               if(@state := 'top', @cycle + 1, @cycle + 1),
                               if(pot < 770, if(@state := 'bottom', @cycle, @cycle), @cycle)
                              ) as cycle
            from `SeInfo` t cross join
                 (select @state := 'bottom', @cyclestart) vars
            order by id
           ) p
     ) t
where minpot < 770 and maxpot >= 1000;

当我运行查询时,上面的代码不会返回任何行……有什么想法吗?

我想您需要一个状态机来跟踪某个对象最近是到达范围的顶部还是底部。然后,可以使用到顶部的过渡来测量循环开始的时间。以下内容获取有关周期的摘要信息:

select cycle, min(pot+0) as minpot, max(pot+0) as maxpot
from (select si.*,
             @cycle := if(pot >= 1000 and @state = 'bottom',
                          if(@state := 'top', @cycle + 1, @cycle + 1),
                          if(pot < 770, if(@state := 'bottom', @cycle, @cycle), @cycle)
                         ) as cycle
      from SeInfo si cross join
           (select @state := 'bottom', @cycle := 0) vars
      order by id
     ) si
group by cycle;
您可以将其用作子查询,以获取符合条件的编号:

select count(*)
from (select cycle, min(pot+0) as minpot, max(pot+0) as maxpot
      from (select si.*,
                   @cycle := if(pot >= 1000 and @state = 'bottom',
                                if(@state := 'top', @cycle + 1, @cycle + 1),
                                if(pot < 770, if(@state := 'bottom', @cycle, @cycle), @cycle)
                               ) as cycle
            from SeInfo si cross join
                 (select @state := 'bottom', @cycle := 0) vars
            order by id
           ) si
      group by cycle
     ) si
where minpot < 770 and maxpot >= 1000;
请注意,这假设您有一列指定值的顺序。SQL表表示无序集,因此需要一列来指定顺序


SQL摆弄它是否正常工作。

我有一个名为id的列,每个条目递增1,因此它创建了排序。我对语法很不熟悉。在我的数据库中运行代码需要什么?我有两列,分别是,pot,id。你能帮我吗?我对你的代码做了一些修改后,它就不工作了。。。它不起作用,因为存在语法错误,我不确定代码中发生了什么,所以我只是尝试将其更改为我的列名和表名,但它不起作用,请查看。@OmarKhawaja。我修复了明显的语法问题。如果你建立了一个SQL FIDLE,那么我们可以让它在你的实际数据结构上工作。我无法将任何数据输入SQL FIDLE,因为它会产生一些错误,但我在这里创建了模式:错误说明:MySQL的查询面板中不允许使用DDL和DML语句;只允许SELECT语句。将DDL和DML放在模式面板中。这可能意味着我无法将数据插入到那个SQL小提琴中。