【问题标题】:Fetch current and next row and compare in a loop获取当前行和下一行并循环比较
【发布时间】:2020-04-30 01:47:45
【问题描述】:

我想比较一个表中的两个值:

这是我的桌子:

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 循环中获取下一个元素。所以我获取它以获取下一个值,然后在循环中再次获取。我可以在循环结束时重新定位光标吗?

【问题讨论】:

  • 好吧,你也可以"比较当前的和以前的"。存储当前行,然后当下一行出现时,比较它,然后覆盖。这将解决一些被跳过的行
  • 请注意,SQL 中的行没有顺序,因此如果要比较下一个和上一个,则需要在某处指定该顺序 - 在查询中或结果数组中。

标签: php mysql loops pdo while-loop


【解决方案1】:

如果您运行的是 MySQL 8.0,这很简单,带有窗口函数lead()

select 
    t.*,
    (value - lead(value) over(order by id) > 0) is_greater
from mytable t

这会为您提供一个名为 is_greater 的布尔标志,具有以下可能值:

  • 1:这个值大于下一个
  • 0:这个值小于下一个
  • null:没有下一个值

Demo on 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

【讨论】:

  • 伟大但不幸的是我是 mysql 7
  • @user6625547:我用早期版本的解决方案更新了我的答案。
  • @user6625547 没有 mysql 7 之类的东西
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 2021-03-29
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多