MySQL在条件上跳过列

时间:2015-11-16 16:38:18

标签: php mysql

我有下表:

id   speed   date
1    0       01/01/2015     
2    0       01/01/2015 
3    0       01/01/2015 
4    0       01/01/2015 
5    0       01/01/2015 
6    0       01/01/2015 
7    25      01/01/2015 
8    78      01/01/2015 
9    13      01/01/2015 
10   45      01/01/2015 
11   0       01/01/2015 
12   80      01/01/2015 
13   86      01/01/2015 
14   10      01/01/2015 
15   0       01/01/2015 
16   0       01/01/2015 
17   0       01/01/2015 
18   0       01/01/2015

这只是表格的一小部分,它有很多日期。每个新日期以未知数量的零开始和结束。我必须跳过这些零,只得到它们之间的区别。所以我提出了以下解决方案:

  1. 获取速度为正的第一行的ID(在我们的表中,它的ID号为4)。

  2. 获取速度为正的最后一行的ID(在我们的表中,它的ID号为12)。

  3. 获取这两个ID(4和12)之间的界限。

  4. 我得到id为正的第一行的speed

    $q1=$conn->prepare("SELECT * FROM tableX WHERE speed > 0 order by date asc LIMIT 1");
    $q1->execute();
    $r1=$q1->fetch();
    $first_id = $r1['id'];
    

    然后获取id为正的最后一行的speed

    $q2=$conn->prepare("SELECT * FROM tableX WHERE speed > 0 order by date desc LIMIT 1");
    $q2->execute();
    $r2=$q2->fetch();
    $last_id = $r2['id'];
    

    然后使用那些id来获得我想要的东西:

    $q3=$conn->prepare("SELECT * FROM tableX WHERE id between '$first_id' and '$last_id'");
    $q3->execute();
    while($r3=$q3->fetch(){}
    

    预期结果:

    id   speed   date
    7    25      01/01/2015 
    8    78      01/01/2015 
    9    13      01/01/2015 
    10   45      01/01/2015 
    11   0       01/01/2015 
    12   80      01/01/2015 
    13   86      01/01/2015 
    14   10      01/01/2015
    

    PS:第11行不是错误。

    我的代码实际上正在运行,但我认为我的解决方案很蹩脚,所以我正在寻找一种改进,将所有这三种查询整合在一起!

1 个答案:

答案 0 :(得分:-1)

我不确定这是否正是您想要的,但我认为这相当于您的整个代码:

$q3=$conn->prepare("SELECT * FROM tableX WHERE speed > 0");
$q3->execute();
while($r3=$q3->fetch(){}