获取当前行和下一行并循环比较

我想比较表中的两个值:


这是我的桌子:


ID;VALUE

1;700

2;600

3;800

4;900

这是我的查询:


$stmt = $db->query("SELECT ID, VALUE FROM TABLE);

现在我喜欢将当前行的结果与下一行的结果进行比较。在 mysql 中这很容易,因为我必须设置行号。我没有找到 PDO 的任何解决方案。


这是我的代码:


while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

      $id = $row["ID"];

      $val_current = $row["VALUE"];

      $row_next = $stmt->fetch(PDO::FETCH_ASSOC);

      $val_next = $row["VALUE"];

      if ($val_current > $val_next){

         echo "$id is greate!";

      }else{

         echo "$id is less!";

      }

}

结果是:


1 is greater

3 is less

他错过了检查 ID 2 和 ID 3 因为我在 while 循环中获取下一个元素。所以我获取它以获取下一个值,然后在循环中再次获取。我可以在循环末尾重新定位光标吗?


波斯汪
浏览 103回答 2
2回答

慕勒3428872

如果您正在运行 MySQL 8.0,则可以直接使用窗口函数lead():select     t.*,    (value - lead(value) over(order by id) > 0) is_greaterfrom mytable t这为您提供了一个名为 的布尔标志is_greater,具有以下可能值:1: 这个值大于下一个0: 这个值小于下一个null: 没有下一个值DB Fiddle 上的演示:身份证 | 价值 | 更伟大-: | ----: | ---------: 1 |   700 |          1 2 |   600 |          0 3 |   800 |          0 4 | 900 |       无效的在早期版本中,一种选择是使用相关子查询:select     t.*,    (value - (        select t1.value         from mytable t1         where t1.id > t.id         order by t1.id limit 1    ) > 0) is_greaterfrom mytable t

杨__羊羊

您只需要记住前一行并在下一次迭代中使用它,假装它是当前行,而当前行将用作下一行。$row = null;while($row_next = $stmt->fetch(PDO::FETCH_ASSOC)) {    if ($row !== null)) {        $id = $row["ID"];        $val_current = $row["VALUE"];        $val_next = $row_next["VALUE"];        if ($val_current > $val_next){            echo "$id is greater!";        }else{            echo "$id is less!";        }        echo "\n";    }    $row = $row_next;}
打开App,查看更多内容
随时随地看视频慕课网APP