为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
波斯汪 2022-07-22 10:18:06
我想比较表中的两个值:这是我的桌子:ID;VALUE1;7002;6003;8004;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 greater3 is less他错过了检查 ID 2 和 ID 3 因为我在 while 循环中获取下一个元素。所以我获取它以获取下一个值,然后在循环中再次获取。我可以在循环末尾重新定位光标吗?
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

如果您正在运行 MySQL 8.0,则可以直接使用窗口函数lead():


select 

    t.*,

    (value - lead(value) over(order by id) > 0) is_greater

from 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_greater

from mytable t


查看完整回答
反对 回复 2022-07-22
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

您只需要记住前一行并在下一次迭代中使用它,假装它是当前行,而当前行将用作下一行。


$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;

}


查看完整回答
反对 回复 2022-07-22
  • 2 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信